{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":9819595,"sourceType":"datasetVersion","datasetId":6020780},{"sourceId":9900911,"sourceType":"datasetVersion","datasetId":6082008},{"sourceId":9904809,"sourceType":"datasetVersion","datasetId":6085017},{"sourceId":9907055,"sourceType":"datasetVersion","datasetId":6086690}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-11-14T11:15:41.062904Z","iopub.execute_input":"2024-11-14T11:15:41.063700Z","iopub.status.idle":"2024-11-14T11:15:42.619475Z","shell.execute_reply.started":"2024-11-14T11:15:41.063644Z","shell.execute_reply":"2024-11-14T11:15:42.618461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2nd column is valence, 3rd column is arousal \n\n# 31 rows x 4 columns","metadata":{}},{"cell_type":"code","source":"# /kaggle/input/raw-ppg-gsr-data-for-emotion-recognition\n\nsample_arousal_valence = pd.read_csv(\"/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/10/10/Arousal_Valence.csv\")\n# sample_arousal_valence = pd.read_csv(\"/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/10/10/Arousal_Valence.csv\")\nprint(sample_arousal_valence)","metadata":{"execution":{"iopub.status.busy":"2024-11-14T11:16:43.541344Z","iopub.execute_input":"2024-11-14T11:16:43.541766Z","iopub.status.idle":"2024-11-14T11:16:43.566570Z","shell.execute_reply.started":"2024-11-14T11:16:43.541727Z","shell.execute_reply":"2024-11-14T11:16:43.565456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_arousal_valence.shape","metadata":{"execution":{"iopub.status.busy":"2024-11-13T14:59:38.841113Z","iopub.execute_input":"2024-11-13T14:59:38.841955Z","iopub.status.idle":"2024-11-13T14:59:38.848536Z","shell.execute_reply.started":"2024-11-13T14:59:38.841915Z","shell.execute_reply":"2024-11-13T14:59:38.847595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import pandas as pd\n\n# sample_raw_gsr = pd.read_csv('/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/10/10/raw_gsr.csv', delimiter=',', encoding='latin1')\n# # print(sample_raw_ppg)\n# pd.read_csv(\"/kaggle/input/raw_data_ppg_gsr/10/10/Arousal_Valence.csv\")\n# with open('/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/10/10/raw_gsr.csv', 'r') as file:\nwith open('/kaggle/input/raw_data_ppg_gsr/10/10/raw_gsr.csv', 'r') as file:\n    for _ in range(5):\n        print(file.readline())\n        \n# sample_raw_gsr = pd.read_csv('/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/10/10/raw_gsr.csv')","metadata":{"execution":{"iopub.status.busy":"2024-11-13T14:59:41.30326Z","iopub.execute_input":"2024-11-13T14:59:41.304088Z","iopub.status.idle":"2024-11-13T14:59:41.312928Z","shell.execute_reply.started":"2024-11-13T14:59:41.304047Z","shell.execute_reply":"2024-11-13T14:59:41.311947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# with open('/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/10/10/raw_gsr.csv', 'r') as file:\nwith open('/kaggle/input/raw_data_ppg_gsr/10/10/raw_gsr.csv', 'r') as file:\n    for i, line in enumerate(file):\n        if 40 <= i <= 50:  # Print lines near the problematic line\n            print(f\"Line {i}: {line}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T14:59:47.150315Z","iopub.execute_input":"2024-11-13T14:59:47.151045Z","iopub.status.idle":"2024-11-13T14:59:47.165236Z","shell.execute_reply.started":"2024-11-13T14:59:47.150986Z","shell.execute_reply":"2024-11-13T14:59:47.164298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"3.\nraw_gsr.csv: This CSV file contains the raw GSR data. For each line, the first item (if not null) represents the timestamp. The second item denotes the GSR data. The third item stores trigger information. Similar to camera.csv, we use k + 10 and k + 100 to indicate the start and stop of the k-th video, respectively.\n\n4.\nraw_ppg.csv: This CSV file contains the raw PPG data. The organization structure of PPG data is the same as GSR data in raw_gsr.csv. The only difference between raw_ppg.csv and raw_gsr.csv is the number of lines per second (100 lines per second for PPG and 4 lines for GSR due to different sampling rates).","metadata":{}},{"cell_type":"code","source":"# with open('/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/10/10/raw_gsr.csv', 'r') as file:\nwith open('/kaggle/input/raw_data_ppg_gsr/10/10/raw_gsr.csv', 'r') as file:\n    for _ in range(55):\n        print(file.readline())","metadata":{"execution":{"iopub.status.busy":"2024-11-13T14:59:53.029988Z","iopub.execute_input":"2024-11-13T14:59:53.030752Z","iopub.status.idle":"2024-11-13T14:59:53.038057Z","shell.execute_reply.started":"2024-11-13T14:59:53.030707Z","shell.execute_reply":"2024-11-13T14:59:53.037138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for gsr\n\n# sample_raw_gsr = pd.read_csv(\n#     '/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/10/10/raw_gsr.csv', \n#     names=['timestamp', 'gsr_value', 'extra_column'],  # Define expected columns\n#     na_values=[''],  # Treat empty strings as NaN\n#     skiprows=1  # Skip header if needed\n# )\n\nsample_raw_gsr = pd.read_csv(\n    '/kaggle/input/raw_data_ppg_gsr/10/10/raw_gsr.csv', \n    names=['timestamp', 'gsr_value', 'start_stop_trigger'],  # Define expected columns\n    na_values=[''],  # Treat empty strings as NaN\n#     skiprows=1  # Skip header if needed\n)","metadata":{"execution":{"iopub.status.busy":"2024-11-13T15:15:26.66999Z","iopub.execute_input":"2024-11-13T15:15:26.67083Z","iopub.status.idle":"2024-11-13T15:15:26.687773Z","shell.execute_reply.started":"2024-11-13T15:15:26.670784Z","shell.execute_reply":"2024-11-13T15:15:26.686862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get unique start_stop_triggers\nunique_triggers = sample_raw_gsr['start_stop_trigger'].unique().tolist()\n\n# Find the positions (row numbers) of each unique start_stop_trigger\ntrigger_positions = {trigger: sample_raw_gsr[sample_raw_gsr['start_stop_trigger'] == trigger].index.tolist()\n                     for trigger in unique_triggers}\n\n# Print the results\nprint(\"Unique start_stop_triggers:\", unique_triggers)\nprint(\"Positions of start_stop_triggers:\", trigger_positions)","metadata":{"execution":{"iopub.status.busy":"2024-11-13T15:15:28.652842Z","iopub.execute_input":"2024-11-13T15:15:28.653219Z","iopub.status.idle":"2024-11-13T15:15:28.685084Z","shell.execute_reply.started":"2024-11-13T15:15:28.653182Z","shell.execute_reply":"2024-11-13T15:15:28.683959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(sample_raw_gsr)","metadata":{"execution":{"iopub.status.busy":"2024-11-13T15:11:28.081909Z","iopub.execute_input":"2024-11-13T15:11:28.082692Z","iopub.status.idle":"2024-11-13T15:11:28.094885Z","shell.execute_reply.started":"2024-11-13T15:11:28.082652Z","shell.execute_reply":"2024-11-13T15:11:28.093867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import pandas as pd\n\n# # Load the raw GSR data\n# sample_raw_gsr = pd.read_csv('/kaggle/input/raw_data_ppg_gsr/10/10/raw_gsr.csv',\n#                              names=['timestamp', 'gsr_value', 'start_stop_trigger'],\n#                              na_values=[''])\n\n# # Load the Arousal_Valence ratings\n# arousal_valence_df = pd.read_csv('/kaggle/input/raw_data_ppg_gsr/10/10/Arousal_Valence.csv', \n#                                  names=['video_id', 'valence', 'arousal', 'dominance'])\n\n# # Dictionary to store data intervals for each video ID\n# data_intervals = {}\n\n# for k in range(32):  # video IDs from 0 to 31\n#     # Define start and stop triggers\n#     start_trigger = k + 10\n#     stop_trigger = k + 100\n\n#     # Find the row indices for start and stop triggers\n#     start_index = sample_raw_gsr[sample_raw_gsr['start_stop_trigger'] == start_trigger].index\n#     stop_index = sample_raw_gsr[sample_raw_gsr['start_stop_trigger'] == stop_trigger].index\n\n#     # Ensure start and stop triggers exist and capture the interval\n#     if not start_index.empty and not stop_index.empty:\n#         interval_data = sample_raw_gsr.loc[start_index[0]:stop_index[0], ['timestamp', 'gsr_value']]\n#         data_intervals[k] = interval_data  # Store interval data for video ID k\n\n# # Print or use data_intervals as needed to analyze arousal and valence correlations\n# # Print each interval data for each video ID\n# for video_id, interval_data in data_intervals.items():\n#     print(f\"Video ID: {video_id}\")\n#     print(interval_data)\n#     print(\"\\n\" + \"=\"*50 + \"\\n\")  # Separator between intervals","metadata":{"execution":{"iopub.status.busy":"2024-11-13T15:28:21.71928Z","iopub.execute_input":"2024-11-13T15:28:21.720223Z","iopub.status.idle":"2024-11-13T15:28:21.857855Z","shell.execute_reply.started":"2024-11-13T15:28:21.720168Z","shell.execute_reply":"2024-11-13T15:28:21.856862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\n# Load the raw GSR data\nsample_raw_gsr = pd.read_csv('/kaggle/input/raw_data_ppg_gsr/10/10/raw_gsr.csv',\n                             names=['timestamp', 'gsr_value', 'start_stop_trigger'],\n                             na_values=[''])\n\n# Load the Arousal_Valence ratings\narousal_valence_df = pd.read_csv('/kaggle/input/raw_data_ppg_gsr/10/10/Arousal_Valence.csv', \n                                 names=['video_id', 'valence', 'arousal', 'dominance'])\n\n# Dictionary to store data intervals with arousal and valence labels for each video ID\ndata_intervals_with_labels = {}\n\nfor k in range(32):  # video IDs from 0 to 31\n    # Define start and stop triggers\n    start_trigger = k + 10\n    stop_trigger = k + 100\n\n    # Find the row indices for start and stop triggers\n    start_index = sample_raw_gsr[sample_raw_gsr['start_stop_trigger'] == start_trigger].index\n    stop_index = sample_raw_gsr[sample_raw_gsr['start_stop_trigger'] == stop_trigger].index\n\n    # Ensure start and stop triggers exist and capture the interval\n    if not start_index.empty and not stop_index.empty:\n        interval_data = sample_raw_gsr.loc[start_index[0]:stop_index[0], ['timestamp', 'gsr_value']]\n\n        # Retrieve the arousal and valence values for the current video ID\n        valence = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'valence'].values[0]\n        arousal = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'arousal'].values[0]\n\n        # Store interval data along with valence and arousal labels\n        data_intervals_with_labels[k] = {\n            'gsr_data': interval_data,\n            'valence': valence,\n            'arousal': arousal\n        }\n\n# Print the GSR data intervals with their corresponding valence and arousal values\nfor video_id, data in data_intervals_with_labels.items():\n    print(f\"Video ID: {video_id}\")\n    print(\"Valence:\", data['valence'])\n    print(\"Arousal:\", data['arousal'])\n    print(\"GSR Data:\")\n    print(data['gsr_data'])\n    print(\"\\n\" + \"=\"*50 + \"\\n\")  # Separator between intervals\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T16:08:03.159079Z","iopub.execute_input":"2024-11-13T16:08:03.159874Z","iopub.status.idle":"2024-11-13T16:08:03.332187Z","shell.execute_reply.started":"2024-11-13T16:08:03.159831Z","shell.execute_reply":"2024-11-13T16:08:03.331249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Use start stop triggers to match data time intervals","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n\n# Load the raw PPG data\nsample_raw_ppg = pd.read_csv('/kaggle/input/raw_data_ppg_gsr/10/10/raw_ppg.csv',\n                             names=['timestamp', 'ppg_value', 'start_stop_trigger'],\n                             na_values=[''])\n\n# Load the Arousal_Valence ratings\narousal_valence_df = pd.read_csv('/kaggle/input/raw_data_ppg_gsr/10/10/Arousal_Valence.csv', \n                                 names=['video_id', 'valence', 'arousal', 'dominance'])\n\n# Dictionary to store data intervals with arousal and valence labels for each video ID\nppg_data_intervals_with_labels = {}\n\nfor k in range(32):  # video IDs from 0 to 31\n    # Define start and stop triggers\n    start_trigger = k + 10\n    stop_trigger = k + 100\n\n    # Find the row indices for start and stop triggers\n    start_index = sample_raw_ppg[sample_raw_ppg['start_stop_trigger'] == start_trigger].index\n    stop_index = sample_raw_ppg[sample_raw_ppg['start_stop_trigger'] == stop_trigger].index\n\n    # Ensure start and stop triggers exist and capture the interval\n    if not start_index.empty and not stop_index.empty:\n        interval_data = sample_raw_ppg.loc[start_index[0]:stop_index[0], ['timestamp', 'ppg_value']]\n\n        # Retrieve the arousal and valence values for the current video ID\n        valence = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'valence'].values[0]\n        arousal = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'arousal'].values[0]\n\n        # Store interval data along with valence and arousal labels\n        ppg_data_intervals_with_labels[k] = {\n            'ppg_data': interval_data,\n            'valence': valence,\n            'arousal': arousal\n        }\n\n# Print the PPG data intervals with their corresponding valence and arousal values\nfor video_id, data in ppg_data_intervals_with_labels.items():\n    print(f\"Video ID: {video_id}\")\n    print(\"Valence:\", data['valence'])\n    print(\"Arousal:\", data['arousal'])\n    print(\"PPG Data:\")\n    print(data['ppg_data'])\n    print(\"\\n\" + \"=\"*50 + \"\\n\")  # Separator between intervals\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# No need to run this as the data and categories as stored in text file\n# Iterate through all subject folders and obtain their data intervals based on start stop trigger & arousal and valence\n \n# Not normalized - need this for time & frequency domain features extraction, apply standard scaler after train test split","metadata":{}},{"cell_type":"code","source":"import os\nimport pandas as pd\n\nbase_dir = '/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/'\ndata_intervals_not_normalized = []\n\n# Function to load and process PPG or GSR data\ndef load_sensor_data(file_path, start_trigger, stop_trigger, value_column):\n    data = pd.read_csv(file_path, names=['timestamp', value_column, 'start_stop_trigger'], na_values=[''])\n    start_index = data[data['start_stop_trigger'] == start_trigger].index\n    stop_index = data[data['start_stop_trigger'] == stop_trigger].index\n    if not start_index.empty and not stop_index.empty:\n        return data.loc[start_index[0]:stop_index[0], value_column].values\n    else:\n        return None\n\n# Mapping function for arousal and valence levels\ndef map_level(value):\n    if 1 <= value <= 3:\n        return 'L'  # Low\n    elif 4 <= value <= 6:\n        return 'M'  # Medium\n    elif 7 <= value <= 9:\n        return 'H'  # High\n    \n# Iterate over each subject's folder\nfor subject_id in os.listdir(base_dir):\n    subject_path = os.path.join(base_dir, subject_id, subject_id)\n    \n    # Check if the folder name is purely numeric (indicating a subject)\n    if os.path.isdir(subject_path) and subject_id.isdigit():\n        \n        # Load arousal and valence labels for this subject\n        arousal_valence_path = os.path.join(subject_path, 'Arousal_Valence.csv')\n        arousal_valence_df = pd.read_csv(arousal_valence_path, names=['video_id', 'valence', 'arousal', 'dominance'])\n        \n        # Paths to GSR and PPG data files\n        gsr_path = os.path.join(subject_path, 'raw_gsr.csv')\n        ppg_path = os.path.join(subject_path, 'raw_ppg.csv')\n\n        # Only process if both GSR and PPG data files exist\n        if os.path.exists(gsr_path) and os.path.exists(ppg_path):\n\n            for k in range(32):  # Loop over each video ID's start/stop triggers\n                start_trigger = k + 10\n                stop_trigger = k + 100\n\n                # Load GSR data interval\n                gsr_interval = load_sensor_data(gsr_path, start_trigger, stop_trigger, 'gsr_value')\n\n                # Load PPG data interval\n                ppg_interval = load_sensor_data(ppg_path, start_trigger, stop_trigger, 'ppg_value')\n\n                # Check if intervals are valid and retrieve labels\n                if gsr_interval is not None and ppg_interval is not None:\n                    valence = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'valence'].values[0]\n                    arousal = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'arousal'].values[0]\n                    \n                    # Map arousal and valence to Low, Medium, High\n                    arousal_level = map_level(arousal)\n                    valence_level = map_level(valence)\n                    arousal_valence_label = f\"A{arousal_level}V{valence_level}\"\n\n                    # Convert GSR and PPG data to comma-separated strings\n                    gsr_data_str = \",\".join(map(str, gsr_interval))\n                    ppg_data_str = \",\".join(map(str, ppg_interval))\n\n                    # Append data to the intervals list for model input\n                    data_intervals_not_normalized.append({\n                        'subject_id': subject_id,\n                        'video_id': k,\n                        'gsr_data': gsr_data_str,  # Store as comma-separated string\n                        'ppg_data': ppg_data_str,  # Store as comma-separated string\n                        'valence': valence,\n                        'arousal': arousal,\n                        'arousal_level': arousal_level,\n                        'valence_level': valence_level,\n                        'arousal_valence_label': arousal_valence_label  # Store arousal_valence_label\n                    })\n\n# Print a few samples to verify data\nfor data in data_intervals_not_normalized[:5]:  # Print first 5 samples as a check\n    print(f\"Subject ID: {data['subject_id']}, Video ID: {data['video_id']}\")\n    print(\"Valence:\", data['valence'])\n    print(\"Arousal:\", data['arousal'])\n    print(\"GSR Data:\", data['gsr_data'])\n    print(\"PPG Data:\", data['ppg_data'])\n    print(\"Arousal Valence Label:\", data['arousal_valence_label'])  # Print the label\n    print(\"\\n\" + \"=\"*50 + \"\\n\")  # Separator between samples\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T11:18:07.769740Z","iopub.execute_input":"2024-11-14T11:18:07.770155Z","iopub.status.idle":"2024-11-14T11:22:41.215094Z","shell.execute_reply.started":"2024-11-14T11:18:07.770117Z","shell.execute_reply":"2024-11-14T11:22:41.214025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# print(len(data))","metadata":{"execution":{"iopub.status.busy":"2024-11-13T17:44:29.72407Z","iopub.execute_input":"2024-11-13T17:44:29.724818Z","iopub.status.idle":"2024-11-13T17:44:29.729654Z","shell.execute_reply.started":"2024-11-13T17:44:29.724761Z","shell.execute_reply":"2024-11-13T17:44:29.728764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(data_intervals_not_normalized))","metadata":{"execution":{"iopub.status.busy":"2024-11-14T11:23:17.711605Z","iopub.execute_input":"2024-11-14T11:23:17.711979Z","iopub.status.idle":"2024-11-14T11:23:17.717407Z","shell.execute_reply.started":"2024-11-14T11:23:17.711945Z","shell.execute_reply":"2024-11-14T11:23:17.716498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save to text file and csv file","metadata":{}},{"cell_type":"code","source":"\nimport os\nimport pandas as pd\n\n\n# Define a path to save the files in the working directory\noutput_dir = '/kaggle/working/'\n\n# Ensure the output directory exists\nos.makedirs(output_dir, exist_ok=True)\n\n# Save the data_intervals to a TXT file (saving as a readable string format)\ndef save_to_txt(data_intervals, filename='data_intervals_not_normalized1.txt'):\n    file_path = os.path.join(output_dir, filename)\n    with open(file_path, 'w') as f:\n        for item in data_intervals:\n            f.write(str(item) + \"\\n\\n\")  # Each dictionary entry on a new line with a space between them\n    print(f\"Data saved to {file_path}\")\n\n# Save the data_intervals to text format\n\nsave_to_txt(data_intervals_not_normalized)\n\n\nprint(\"Data saved to .txt file in Kaggle working directory.\")\n\n\n\n# Convert the data_intervals list of dictionaries to a DataFrame\ndata_intervals_dataframe = pd.DataFrame(data_intervals_not_normalized)\n\n# Save the DataFrame to a CSV file\ndata_intervals_dataframe.to_csv('data_intervals_not_normalized1.csv', index=False)\n\nprint(\"Data saved to data_intervals_not_normalized1.csv\")\n\n# Specify the path to the CSV file\nfile_path = '/kaggle/working/data_intervals_not_normalized1.csv'\n\n# Read the CSV file into a DataFrame\ndata_intervals_not_normalized = pd.read_csv(file_path)\n\n# # Display the first few rows to verify\n# print(data_intervals_not_normalized1.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T11:24:41.297744Z","iopub.execute_input":"2024-11-14T11:24:41.298500Z","iopub.status.idle":"2024-11-14T11:24:44.607480Z","shell.execute_reply.started":"2024-11-14T11:24:41.298454Z","shell.execute_reply":"2024-11-14T11:24:44.606298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Display the first few rows to verify\nprint(data_intervals_not_normalized.head())","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:27:19.780045Z","iopub.execute_input":"2024-11-14T14:27:19.780905Z","iopub.status.idle":"2024-11-14T14:27:19.835407Z","shell.execute_reply.started":"2024-11-14T14:27:19.780864Z","shell.execute_reply":"2024-11-14T14:27:19.834306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_intervals_not_normalized.shape","metadata":{"execution":{"iopub.status.busy":"2024-11-14T11:25:13.206256Z","iopub.execute_input":"2024-11-14T11:25:13.206688Z","iopub.status.idle":"2024-11-14T11:25:13.214738Z","shell.execute_reply.started":"2024-11-14T11:25:13.206644Z","shell.execute_reply":"2024-11-14T11:25:13.213656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Normalized PPG and GSR data for each sequence & using numerical values","metadata":{}},{"cell_type":"code","source":"# import os\n# import pandas as pd\n# from sklearn.preprocessing import StandardScaler\n\n# base_dir = '/kaggle/input/raw_data_ppg_gsr/'\n# data_intervals = []\n\n# # Function to load and process PPG or GSR data\n# def load_sensor_data(file_path, start_trigger, stop_trigger, value_column):\n#     data = pd.read_csv(file_path, names=['timestamp', value_column, 'start_stop_trigger'], na_values=[''])\n#     start_index = data[data['start_stop_trigger'] == start_trigger].index\n#     stop_index = data[data['start_stop_trigger'] == stop_trigger].index\n#     if not start_index.empty and not stop_index.empty:\n#         return data.loc[start_index[0]:stop_index[0], value_column].values\n#     else:\n#         return None\n\n# # Initialize scalers for PPG and GSR data\n# scaler_ppg = StandardScaler()\n# scaler_gsr = StandardScaler()\n\n# # Iterate over each subject's folder\n# for subject_id in os.listdir(base_dir):\n#     subject_path = os.path.join(base_dir, subject_id, subject_id)\n    \n#     # Check if the folder name is purely numeric (indicating a subject)\n#     if os.path.isdir(subject_path) and subject_id.isdigit():\n        \n#         # Load arousal and valence labels for this subject\n#         arousal_valence_path = os.path.join(subject_path, 'Arousal_Valence.csv')\n#         arousal_valence_df = pd.read_csv(arousal_valence_path, names=['video_id', 'valence', 'arousal', 'dominance'])\n        \n#         # Paths to GSR and PPG data files\n#         gsr_path = os.path.join(subject_path, 'raw_gsr.csv')\n#         ppg_path = os.path.join(subject_path, 'raw_ppg.csv')\n\n#         # Only process if both GSR and PPG data files exist\n#         if os.path.exists(gsr_path) and os.path.exists(ppg_path):\n\n#             for k in range(32):  # Loop over each video ID's start/stop triggers\n#                 start_trigger = k + 10\n#                 stop_trigger = k + 100\n\n#                 # Load GSR data interval\n#                 gsr_interval = load_sensor_data(gsr_path, start_trigger, stop_trigger, 'gsr_value')\n\n#                 # Load PPG data interval\n#                 ppg_interval = load_sensor_data(ppg_path, start_trigger, stop_trigger, 'ppg_value')\n\n#                 # Check if intervals are valid and retrieve labels\n#                 if gsr_interval is not None and ppg_interval is not None:\n#                     valence = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'valence'].values[0]\n#                     arousal = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'arousal'].values[0]\n\n#                     # Normalize the PPG and GSR data using the scalers\n#                     normalized_ppg = scaler_ppg.fit_transform(ppg_interval.reshape(-1, 1)).flatten()\n#                     normalized_gsr = scaler_gsr.fit_transform(gsr_interval.reshape(-1, 1)).flatten()\n\n#                     # Append data to the intervals list for model input\n#                     data_intervals.append({\n#                         'subject_id': subject_id,\n#                         'video_id': k,\n#                         'gsr_data': normalized_gsr,\n#                         'ppg_data': normalized_ppg,\n#                         'valence': valence,\n#                         'arousal': arousal\n#                     })\n\n# # Print a few samples to verify data\n# for data in data_intervals[:5]:  # Print first 5 samples as a check\n#     print(f\"Subject ID: {data['subject_id']}, Video ID: {data['video_id']}\")\n#     print(\"Valence:\", data['valence'])\n#     print(\"Arousal:\", data['arousal'])\n#     print(\"Normalized GSR Data:\", data['gsr_data'])\n#     print(\"Normalized PPG Data:\", data['ppg_data'])\n#     print(\"\\n\" + \"=\"*50 + \"\\n\")  # Separator between samples\n\n# # The data_intervals list now contains input sequences and labels for multi-input LSTM\n\n# print(data)\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T18:38:49.478198Z","iopub.execute_input":"2024-11-13T18:38:49.478903Z","iopub.status.idle":"2024-11-13T18:42:56.372784Z","shell.execute_reply.started":"2024-11-13T18:38:49.478864Z","shell.execute_reply":"2024-11-13T18:42:56.371756Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# print(len(data_intervals))","metadata":{"execution":{"iopub.status.busy":"2024-11-13T18:44:55.123356Z","iopub.execute_input":"2024-11-13T18:44:55.124457Z","iopub.status.idle":"2024-11-13T18:44:55.130246Z","shell.execute_reply.started":"2024-11-13T18:44:55.124399Z","shell.execute_reply":"2024-11-13T18:44:55.129006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save data_intervals to text file to load for future use","metadata":{}},{"cell_type":"code","source":"# import json\n# import os\n\n# # Define a path to save the files in the working directory\n# output_dir = '/kaggle/working/'\n\n# # Ensure the output directory exists\n# os.makedirs(output_dir, exist_ok=True)\n\n# # # Save the data_intervals to a JSON file\n# # def save_to_json(data_intervals, filename='data_intervals.json'):\n# #     file_path = os.path.join(output_dir, filename)\n# #     with open(file_path, 'w') as f:\n# #         json.dump(data_intervals, f)\n# #     print(f\"Data saved to {file_path}\")\n\n# # Save the data_intervals to a TXT file (saving as a readable string format)\n# def save_to_txt(data_intervals, filename='data_intervals.txt'):\n#     file_path = os.path.join(output_dir, filename)\n#     with open(file_path, 'w') as f:\n#         for item in data_intervals:\n#             f.write(str(item) + \"\\n\\n\")  # Each dictionary entry on a new line with a space between them\n#     print(f\"Data saved to {file_path}\")\n\n# # Save the data_intervals to both formats\n# # save_to_json(data_intervals)\n# save_to_txt(data_intervals)\n\n# # print(\"Data saved to both .json and .txt files.\")\n# print(\"Data saved to .txt file in Kaggle working directory.\")\n\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T18:48:40.68952Z","iopub.execute_input":"2024-11-13T18:48:40.689951Z","iopub.status.idle":"2024-11-13T18:48:43.701591Z","shell.execute_reply.started":"2024-11-13T18:48:40.689912Z","shell.execute_reply":"2024-11-13T18:48:43.700577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Normalized PPG & GSR data with ","metadata":{}},{"cell_type":"code","source":"# import os\n# import pandas as pd\n# import json\n# from sklearn.preprocessing import StandardScaler\n\n# base_dir = '/kaggle/input/raw_data_ppg_gsr/'\n# data_intervals = []\n\n# # Function to load and process PPG or GSR data\n# def load_sensor_data(file_path, start_trigger, stop_trigger, value_column):\n#     data = pd.read_csv(file_path, names=['timestamp', value_column, 'start_stop_trigger'], na_values=[''])\n#     start_index = data[data['start_stop_trigger'] == start_trigger].index\n#     stop_index = data[data['start_stop_trigger'] == stop_trigger].index\n#     if not start_index.empty and not stop_index.empty:\n#         return data.loc[start_index[0]:stop_index[0], value_column].values\n#     else:\n#         return None\n\n# # Initialize scalers for PPG and GSR data\n# scaler_ppg = StandardScaler()\n# scaler_gsr = StandardScaler()\n\n# # Mapping function for arousal and valence levels\n# def map_level(value):\n#     if 1 <= value <= 3:\n#         return 'L'  # Low\n#     elif 4 <= value <= 6:\n#         return 'M'  # Medium\n#     elif 7 <= value <= 9:\n#         return 'H'  # High\n\n# # Iterate over each subject's folder\n# for subject_id in os.listdir(base_dir):\n#     subject_path = os.path.join(base_dir, subject_id, subject_id)\n    \n#     # Check if the folder name is purely numeric (indicating a subject)\n#     if os.path.isdir(subject_path) and subject_id.isdigit():\n        \n#         # Load arousal and valence labels for this subject\n#         arousal_valence_path = os.path.join(subject_path, 'Arousal_Valence.csv')\n#         arousal_valence_df = pd.read_csv(arousal_valence_path, names=['video_id', 'valence', 'arousal', 'dominance'])\n        \n#         # Paths to GSR and PPG data files\n#         gsr_path = os.path.join(subject_path, 'raw_gsr.csv')\n#         ppg_path = os.path.join(subject_path, 'raw_ppg.csv')\n\n#         # Only process if both GSR and PPG data files exist\n#         if os.path.exists(gsr_path) and os.path.exists(ppg_path):\n\n#             for k in range(32):  # Loop over each video ID's start/stop triggers\n#                 start_trigger = k + 10\n#                 stop_trigger = k + 100\n\n#                 # Load GSR data interval\n#                 gsr_interval = load_sensor_data(gsr_path, start_trigger, stop_trigger, 'gsr_value')\n\n#                 # Load PPG data interval\n#                 ppg_interval = load_sensor_data(ppg_path, start_trigger, stop_trigger, 'ppg_value')\n\n#                 # Check if intervals are valid and retrieve labels\n#                 if gsr_interval is not None and ppg_interval is not None:\n#                     valence = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'valence'].values[0]\n#                     arousal = arousal_valence_df.loc[arousal_valence_df['video_id'] == k, 'arousal'].values[0]\n\n#                     # Map arousal and valence to Low, Medium, High\n#                     arousal_level = map_level(arousal)\n#                     valence_level = map_level(valence)\n#                     arousal_valence_label = f\"A{arousal_level}V{valence_level}\"\n\n#                     # Normalize the PPG and GSR data using the scalers\n#                     normalized_ppg = scaler_ppg.fit_transform(ppg_interval.reshape(-1, 1)).flatten()\n#                     normalized_gsr = scaler_gsr.fit_transform(gsr_interval.reshape(-1, 1)).flatten()\n\n#                     # Append data to the intervals list for model input\n#                     data_intervals.append({\n#                         'subject_id': subject_id,\n#                         'video_id': k,\n#                         'gsr_data': normalized_gsr.tolist(),\n#                         'ppg_data': normalized_ppg.tolist(),\n#                         'valence': valence,\n#                         'arousal': arousal,\n#                         'arousal_level': arousal_level,\n#                         'valence_level': valence_level,\n#                         'arousal_valence_label': arousal_valence_label\n#                     })\n\n# # # Save data_intervals to a .txt file\n# # output_path = '/kaggle/working/data_intervals_with_categories.txt'\n# # with open(output_path, 'w') as f:\n# #     json.dump(data_intervals, f)\n\n# # Function to load data_intervals from the .txt file\n# def load_data_intervals(file_path):\n#     with open(file_path, 'r') as f:\n#         loaded_data = json.load(f)\n#     return loaded_data\n\n# # Example usage of load_data_intervals\n# loaded_data_intervals = load_data_intervals(output_path)\n# # print(\"Loaded Data Intervals Sample:\", loaded_data_intervals[:1])  # Print first sample as a check\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T02:26:37.754586Z","iopub.execute_input":"2024-11-14T02:26:37.754878Z","iopub.status.idle":"2024-11-14T02:31:01.077348Z","shell.execute_reply.started":"2024-11-14T02:26:37.754845Z","shell.execute_reply":"2024-11-14T02:31:01.075927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# No need to do this as preprocessed data is now stored in text file\n# Save to text file","metadata":{}},{"cell_type":"code","source":"# import os\n\n# # Define a path to save the files in the working directory\n# output_dir = '/kaggle/working/'\n\n# # Ensure the output directory exists\n# os.makedirs(output_dir, exist_ok=True)\n\n\n\n# # Save the data_intervals to a TXT file (saving as a readable string format)\n# def save_to_txt(data_intervals, filename='data_intervals_with_categories.txt'):\n#     file_path = os.path.join(output_dir, filename)\n#     with open(file_path, 'w') as f:\n#         for item in data_intervals:\n#             f.write(str(item) + \"\\n\\n\")  # Each dictionary entry on a new line with a space between them\n#     print(f\"Data saved to {file_path}\")\n\n\n# save_to_txt(data_intervals)\n\n# # print(\"Data saved to both .json and .txt files.\")\n# print(\"Data saved to .txt file in Kaggle working directory.\")","metadata":{"execution":{"iopub.status.busy":"2024-11-14T02:36:04.740762Z","iopub.execute_input":"2024-11-14T02:36:04.741209Z","iopub.status.idle":"2024-11-14T02:36:10.210763Z","shell.execute_reply.started":"2024-11-14T02:36:04.741171Z","shell.execute_reply":"2024-11-14T02:36:10.209766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import os\n\n# # Define a path to save the files in the working directory\n# output_dir = '/kaggle/working/'\n\n# # Ensure the output directory exists\n# os.makedirs(output_dir, exist_ok=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# print(len(data_intervals))","metadata":{"execution":{"iopub.status.busy":"2024-11-14T02:36:25.94938Z","iopub.execute_input":"2024-11-14T02:36:25.949776Z","iopub.status.idle":"2024-11-14T02:36:25.95495Z","shell.execute_reply.started":"2024-11-14T02:36:25.949739Z","shell.execute_reply":"2024-11-14T02:36:25.95381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# If loading from input directory [ will work only after uploading the text file as input ]","metadata":{}},{"cell_type":"code","source":"# # # Load data from JSON file\n# # def load_from_json(filename='data_intervals.json'):\n# #     with open(filename, 'r') as f:\n# #         return json.load(f)\n\n# # Load data from TXT file\n# def load_from_txt(filename='/kaggle/input/multimodal-dataset-data-intervals-categories/data_intervals_with_categories.txt'):\n#     with open(filename, 'r') as f:\n#         data = f.readlines()\n#     return [eval(item.strip()) for item in data if item.strip()]  # Convert string representations back to dictionaries\n\n# # # Example of loading the saved data\n# # data_from_json = load_from_json()  # Load data from JSON file\n# data_from_txt = load_from_txt()    # Load data from TXT file\n\n# # print(\"Data loaded from JSON:\", data_from_json[:1])  # Print first item from loaded JSON data\n# print(\"Data loaded from TXT:\", data_from_txt[:1])    # Print first item from loaded TXT data\n\n# data_intervals = data_from_txt\n\n# print(len(data_intervals))\n\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T06:44:23.942172Z","iopub.execute_input":"2024-11-14T06:44:23.942459Z","iopub.status.idle":"2024-11-14T06:44:46.478714Z","shell.execute_reply.started":"2024-11-14T06:44:23.942426Z","shell.execute_reply":"2024-11-14T06:44:46.477767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Convert to dataframe and csv file","metadata":{}},{"cell_type":"code","source":"# import pandas as pd\n\n# # Convert the data_intervals list of dictionaries to a DataFrame\n# data_intervals_dataframe = pd.DataFrame(data_intervals)\n\n# # Save the DataFrame to a CSV file\n# data_intervals_dataframe.to_csv('data_intervals.csv', index=False)\n\n# print(\"Data saved to data_intervals.csv\")\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T06:54:16.612626Z","iopub.execute_input":"2024-11-14T06:54:16.613001Z","iopub.status.idle":"2024-11-14T06:54:27.588920Z","shell.execute_reply.started":"2024-11-14T06:54:16.612965Z","shell.execute_reply":"2024-11-14T06:54:27.587995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# LOAD THE CSV FILE HERE","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n\n# Specify the path to the CSV file\nfile_path = '/kaggle/input/data-intervals-not-normalized-with-labels/data_intervals_not_normalized1.csv'\n\n# Read the CSV file into a DataFrame\ndata_intervals_dataframe = pd.read_csv(file_path)\n\n# Display the first few rows to verify\nprint(data_intervals_dataframe.head())\n\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T08:51:35.568393Z","iopub.execute_input":"2024-11-15T08:51:35.568931Z","iopub.status.idle":"2024-11-15T08:51:37.564413Z","shell.execute_reply.started":"2024-11-15T08:51:35.568856Z","shell.execute_reply":"2024-11-15T08:51:37.562986Z"},"trusted":true},"execution_count":1,"outputs":[{"name":"stdout","text":"   subject_id  video_id                                           gsr_data  \\\n0           7         0  179125.171875,178570.375,179391.03125,181556.2...   \n1           7         1  182172.671875,182666.59375,183080.09375,184354...   \n2           7         2  168857.21875,168781.234375,169132.53125,169823...   \n3           7         3  178895.96875,178088.4375,177970.546875,177919....   \n4           7         4  195028.421875,195278.421875,195498.46875,19572...   \n\n                                            ppg_data  valence  arousal  \\\n0  612293.0,611442.0,610770.0,610083.0,609360.0,6...        4        5   \n1  551232.0,551091.0,550905.0,550746.0,550549.0,5...        3        5   \n2  605678.0,605853.0,606119.0,606351.0,606579.0,6...        4        5   \n3  565274.0,565598.0,566007.0,566224.0,566272.0,5...        5        6   \n4  549417.0,549378.0,549404.0,549342.0,549404.0,5...        6        6   \n\n  arousal_level valence_level arousal_valence_label  \n0             M             M                  AMVM  \n1             M             L                  AMVL  \n2             M             M                  AMVM  \n3             M             M                  AMVM  \n4             M             M                  AMVM  \n","output_type":"stream"}]},{"cell_type":"code","source":"print(data_intervals_dataframe.arousal_valence_label.nunique())\nprint(data_intervals_dataframe.valence_level.nunique())\nprint(data_intervals_dataframe.arousal_level.nunique())\n\nprint(data_intervals_dataframe.valence_level.nunique())\nprint(data_intervals_dataframe.arousal_level.nunique())\n\nprint(data_intervals_dataframe.valence.nunique())\nprint(data_intervals_dataframe.arousal.nunique())\n\nprint(data_intervals_dataframe.shape)\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:14:38.566063Z","iopub.execute_input":"2024-11-14T14:14:38.566422Z","iopub.status.idle":"2024-11-14T14:14:38.581700Z","shell.execute_reply.started":"2024-11-14T14:14:38.566383Z","shell.execute_reply":"2024-11-14T14:14:38.580616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"subject id:\")\nprint(data_intervals_dataframe.subject_id.unique())\nprint(\"=================\")\nprint(\"Video id:\")\nprint(data_intervals_dataframe.video_id.unique())","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:14:42.623978Z","iopub.execute_input":"2024-11-14T14:14:42.624756Z","iopub.status.idle":"2024-11-14T14:14:42.631549Z","shell.execute_reply.started":"2024-11-14T14:14:42.624712Z","shell.execute_reply":"2024-11-14T14:14:42.630498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# For PPG data extract features based on these steps :\n\n1. Filter data with savgol filter","metadata":{}},{"cell_type":"code","source":"from scipy.signal import savgol_filter\nimport pandas as pd\n\n# Assume data_intervals_dataframe is already loaded from the CSV\n# Convert ppg_data column from string representations of lists to actual lists\n# data_intervals_dataframe['ppg_data'] = data_intervals_dataframe['ppg_data'].apply(eval)\n# Check if the value is a string and apply eval only in that case\ndata_intervals_dataframe['ppg_data'] = data_intervals_dataframe['ppg_data'].apply(\n    lambda x: eval(x) if isinstance(x, str) else x\n)\n\n# Apply Savitzky-Golay filter to each entry in the 'ppg_data' column\npreprocessed_dataframe = data_intervals_dataframe.copy()\npreprocessed_dataframe['ppg_filtered_data'] = preprocessed_dataframe['ppg_data'].apply(\n    lambda x: savgol_filter(x, window_length=5, polyorder=3) if len(x) >= 5 else x\n)\n\n# Drop the original 'ppg_data' column if you no longer need it\npreprocessed_dataframe = preprocessed_dataframe.drop(columns=['ppg_data'])\n\n# Save the new dataframe to a CSV if needed\npreprocessed_dataframe.to_csv('/kaggle/working/preprocessed_data_intervals.csv', index=False)\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T08:53:47.462207Z","iopub.execute_input":"2024-11-15T08:53:47.462653Z","iopub.status.idle":"2024-11-15T08:53:49.836480Z","shell.execute_reply.started":"2024-11-15T08:53:47.462606Z","shell.execute_reply":"2024-11-15T08:53:49.835229Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"print(preprocessed_dataframe)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T08:53:54.701659Z","iopub.execute_input":"2024-11-15T08:53:54.702144Z","iopub.status.idle":"2024-11-15T08:53:54.725500Z","shell.execute_reply.started":"2024-11-15T08:53:54.702097Z","shell.execute_reply":"2024-11-15T08:53:54.723998Z"},"trusted":true},"execution_count":5,"outputs":[{"name":"stdout","text":"      subject_id  video_id                                           gsr_data  \\\n0              7         0  179125.171875,178570.375,179391.03125,181556.2...   \n1              7         1  182172.671875,182666.59375,183080.09375,184354...   \n2              7         2  168857.21875,168781.234375,169132.53125,169823...   \n3              7         3  178895.96875,178088.4375,177970.546875,177919....   \n4              7         4  195028.421875,195278.421875,195498.46875,19572...   \n...          ...       ...                                                ...   \n2331          73        27  235083.5,235510.375,235109.140625,234961.0,234...   \n2332          73        28  234302.875,235212.921875,234673.390625,234568....   \n2333          73        29  234887.546875,234301.828125,234304.59375,23398...   \n2334          73        30  234102.984375,233839.90625,233937.96875,234354...   \n2335          73        31  233566.328125,233756.46875,233891.53125,234115...   \n\n      valence  arousal arousal_level valence_level arousal_valence_label  \\\n0           4        5             M             M                  AMVM   \n1           3        5             M             L                  AMVL   \n2           4        5             M             M                  AMVM   \n3           5        6             M             M                  AMVM   \n4           6        6             M             M                  AMVM   \n...       ...      ...           ...           ...                   ...   \n2331        3        5             M             L                  AMVL   \n2332        7        3             L             H                  ALVH   \n2333        5        5             M             M                  AMVM   \n2334        5        1             L             M                  ALVM   \n2335        3        5             M             L                  AMVL   \n\n                                      ppg_filtered_data  \n0     [612290.5285714283, 611451.8857142854, 610755....  \n1     [551233.9571428568, 551083.1714285712, 550916....  \n2     [605675.7857142858, 605861.8571428573, 606105....  \n3     [565269.7142857142, 565615.142857143, 565981.2...  \n4     [549411.7857142853, 549398.857142857, 549372.7...  \n...                                                 ...  \n2331  [930524.5285714283, 930933.8857142854, 931077....  \n2332  [964479.8428571422, 965561.6285714285, 966608....  \n2333  [914564.614285714, 914270.5428571431, 914029.6...  \n2334  [924691.6142857135, 924947.5428571426, 925199....  \n2335  [993519.0285714283, 991646.8857142855, 989918....  \n\n[2336 rows x 9 columns]\n","output_type":"stream"}]},{"cell_type":"code","source":"# Increase window length to see a noticeable smoothing effect\nfrom scipy.signal import savgol_filter\nimport matplotlib.pyplot as plt\n\n# # Example of updating the preprocessed_dataframe with more noticeable filter\n# preprocessed_dataframe['ppg_filtered_data'] = data_intervals_dataframe['ppg_data'].apply(\n#     lambda x: savgol_filter(x, window_length=11, polyorder=3) if len(x) >= 11 else x\n# )\nsample_index = 53\n# Print the first few values for debugging\nprint(\"Original PPG data:\", data_intervals_dataframe.loc[sample_index, 'ppg_data'][:10])\nprint(\"Filtered PPG data:\", preprocessed_dataframe.loc[sample_index, 'ppg_filtered_data'][:10])\n\n# Now, re-plot\nsample_index = 53\noriginal_ppg_data = data_intervals_dataframe.loc[sample_index, 'ppg_data']\nfiltered_ppg_data = preprocessed_dataframe.loc[sample_index, 'ppg_filtered_data']\n\nplt.figure(figsize=(12, 6))\nplt.plot(original_ppg_data, label='Original PPG Data', color='blue')\nplt.plot(filtered_ppg_data, label='Filtered PPG Data (Savitzky-Golay)', color='red', linestyle='--')\nplt.xlabel('Time')\nplt.ylabel('PPG Signal')\nplt.legend()\nplt.title('Comparison of Original and Filtered PPG Data')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:41:44.764533Z","iopub.execute_input":"2024-11-14T14:41:44.765441Z","iopub.status.idle":"2024-11-14T14:41:44.802969Z","shell.execute_reply.started":"2024-11-14T14:41:44.765396Z","shell.execute_reply":"2024-11-14T14:41:44.801827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Calculate Features\n\n\nCalculate Following features:\n1. mean\n2. median\n3. maximum\n4. variance\n5. standard deviation\n6. maximum\n7. minimum\n\nTime Domain Features:\n\n1. ranges\n2. rmssd: root mean square of successive differences\n3. sdsd : standard deviation of successive differences\n4. nni_50: number of normal-to-normal intervals greater than 50ms\n5. pnni_50: proportion of normal-to-normal intervals > 50ms\n6. nni_20: number of normal-to-normal intervals greater than 20ms. Count of successive heartbeats where time difference exceeds 20ms\n7. pnni_20: proportion of normal-to-normal intervals greater than 20ms\n8. avg_hr\n9. std_hr\n10. min_hr\n11. max_hr\n12. energy\n13. abs_sum_diff","metadata":{}},{"cell_type":"code","source":"def ranges(x):\n    return x.max() - x.min()\n\ndef rmssd(x):\n    return np.sqrt(np.mean(np.diff(x)**2))\n\ndef sdsd(x):\n    return st.stdev(np.diff(x))\n\ndef nni_50(x):\n    return sum(np.abs(np.diff(x)) > 50)\n\ndef pnni_50(x):\n    return 100* nni_50(x) / len(x)\n\ndef nni_20(x):\n    return sum(np.abs(np.diff(x)) >20)\n\ndef pnni_20(x):\n    return 100 * nni_20(x) / len(x)\n\ndef avg_hr(x):\n    return st.mean(60000/x)\n\ndef std_hr(x):\n    return st.stdev(60000/x)\n\ndef min_hr(x):\n    return min(60000/x)\n\ndef max_hr(x):\n    return max(60000/x)\n\ndef energy(x):\n    return sum(np.square(x))\n\ndef abs_sum_diff(x):\n    # sum of absolute differences (SAD) is a measure of the similarity between signal\n    return sum(np.abs(np.diff(x)))\n\nimport numpy as np\nimport statistics as st\n\n# Define the custom functions if not already defined\ndef ranges(x):\n    return x.max() - x.min()\n\ndef rmssd(x):\n    return np.sqrt(np.mean(np.diff(x)**2))\n\ndef sdsd(x):\n    return st.stdev(np.diff(x))\n\ndef nni_50(x):\n    return sum(np.abs(np.diff(x)) > 50)\n\ndef pnni_50(x):\n    return 100 * nni_50(x) / len(x)\n\ndef nni_20(x):\n    return sum(np.abs(np.diff(x)) > 20)\n\ndef pnni_20(x):\n    return 100 * nni_20(x) / len(x)\n\ndef avg_hr(x):\n    # Avoid division by zero or NaN values\n    hr = 60000 / np.array(x)\n    hr = hr[np.isfinite(hr)]  # Remove non-finite values (e.g., inf, NaN)\n    return st.mean(hr) if len(hr) > 0 else 0  # Return 0 if no valid HR data\n\ndef std_hr(x):\n    # Avoid division by zero or NaN values\n    hr = 60000 / np.array(x)\n    hr = hr[np.isfinite(hr)]  # Remove non-finite values (e.g., inf, NaN)\n    return st.stdev(hr) if len(hr) > 1 else 0  # Return 0 if not enough valid data for std dev\n\ndef min_hr(x):\n    # Avoid division by zero or NaN values\n    hr = 60000 / np.array(x)\n    hr = hr[np.isfinite(hr)]  # Remove non-finite values (e.g., inf, NaN)\n    return min(hr) if len(hr) > 0 else 0  # Return 0 if no valid HR data\n\ndef max_hr(x):\n    # Avoid division by zero or NaN values\n    hr = 60000 / np.array(x)\n    hr = hr[np.isfinite(hr)]  # Remove non-finite values (e.g., inf, NaN)\n    return max(hr) if len(hr) > 0 else 0  # Return 0 if no valid HR data\n\ndef energy(x):\n    return sum(np.square(x))\n\ndef abs_sum_diff(x):\n    return sum(np.abs(np.diff(x)))","metadata":{"execution":{"iopub.status.busy":"2024-11-15T09:18:33.383035Z","iopub.execute_input":"2024-11-15T09:18:33.383484Z","iopub.status.idle":"2024-11-15T09:18:33.414798Z","shell.execute_reply.started":"2024-11-15T09:18:33.383440Z","shell.execute_reply":"2024-11-15T09:18:33.412944Z"},"trusted":true},"execution_count":15,"outputs":[]},{"cell_type":"code","source":"\n\n# Apply the functions to 'ppg_filtered_data' in preprocessed_dataframe\ntime_features = preprocessed_dataframe['ppg_filtered_data'].apply(\n    lambda x: pd.Series({\n        'mean': np.mean(x),\n        'var': np.var(x),\n        'median': np.median(x),\n        'max': np.max(x),\n        'min': np.min(x),\n        'range': ranges(x),\n        'rmssd': rmssd(x),\n        'sdsd': sdsd(x),\n        'nni_50': nni_50(x),\n        'pnni_50': pnni_50(x),\n        'nni_20': nni_20(x),\n        'pnni_20': pnni_20(x),\n        'avg_hr': avg_hr(x),\n        'std_hr': std_hr(x),\n        'min_hr': min_hr(x),\n        'max_hr': max_hr(x),\n        'energy': energy(x),\n        'abs_sum_diff': abs_sum_diff(x)\n    })\n)\n\n# Reset the index to align with the preprocessed_dataframe\ntime_features = time_features.reset_index(drop=True)\n\n# Add the 'subject_id', 'video_id', and 'arousal_valence_label' to the time_features dataframe\ntime_features['subject_id'] = preprocessed_dataframe['subject_id']\ntime_features['video_id'] = preprocessed_dataframe['video_id']\ntime_features['arousal_valence_label'] = preprocessed_dataframe['arousal_valence_label']\n\n# Optionally, check the result\nprint(time_features.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:44:09.862469Z","iopub.execute_input":"2024-11-14T14:44:09.863348Z","iopub.status.idle":"2024-11-14T14:45:00.011315Z","shell.execute_reply.started":"2024-11-14T14:44:09.863307Z","shell.execute_reply":"2024-11-14T14:45:00.010295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# PPG DATA EXTRACTED FEATURES FOR TIME DOMAIN","metadata":{}},{"cell_type":"code","source":"print(time_features.shape) ","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:46:00.113729Z","iopub.execute_input":"2024-11-14T14:46:00.114159Z","iopub.status.idle":"2024-11-14T14:46:00.119153Z","shell.execute_reply.started":"2024-11-14T14:46:00.114120Z","shell.execute_reply":"2024-11-14T14:46:00.118219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save time features to csv","metadata":{}},{"cell_type":"code","source":"# Save the DataFrame to a CSV file\ntime_features.to_csv('ppg_time_features.csv', index=False)\n\nprint(\"Data saved to ppg_time_features.csv\")\n\n# Specify the path to the CSV file\nfile_path = '/kaggle/working/ppg_time_features.csv'\n\n# Read the CSV file into a DataFrame\ntime_features = pd.read_csv(file_path)","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:47:25.475138Z","iopub.execute_input":"2024-11-14T14:47:25.475488Z","iopub.status.idle":"2024-11-14T14:47:25.574922Z","shell.execute_reply.started":"2024-11-14T14:47:25.475455Z","shell.execute_reply":"2024-11-14T14:47:25.573994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(time_features)","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:47:49.446830Z","iopub.execute_input":"2024-11-14T14:47:49.447720Z","iopub.status.idle":"2024-11-14T14:47:49.466346Z","shell.execute_reply.started":"2024-11-14T14:47:49.447674Z","shell.execute_reply":"2024-11-14T14:47:49.465190Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Frequency Features","metadata":{}},{"cell_type":"code","source":"from scipy import signal \nfrom scipy.ndimage import label\nfrom scipy.stats import zscore\nfrom scipy.interpolate import interp1d\nfrom scipy import integrate\nfrom scipy.integrate import *  # this will include trapz. BUT using a wildcard import is not recommended as \n# it imports all functions and variables from the scipy.integrate module which can cause namespace pollution, conflicts btw similarly\n# named functions in different libraries\n\n# from scipy.integrate import trapz\n# from scipy import trapz\n\nfrom numpy import trapz # ORIGINALLY USED FROM SCIPY.INTEGRATE IMPORT TRAPZ WHICH DID NOT WORK","metadata":{"execution":{"iopub.status.busy":"2024-11-14T11:49:31.069380Z","iopub.execute_input":"2024-11-14T11:49:31.070174Z","iopub.status.idle":"2024-11-14T11:49:32.056135Z","shell.execute_reply.started":"2024-11-14T11:49:31.070126Z","shell.execute_reply":"2024-11-14T11:49:32.055031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(preprocessed_dataframe)","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:10:58.804808Z","iopub.execute_input":"2024-11-14T14:10:58.805759Z","iopub.status.idle":"2024-11-14T14:10:59.131540Z","shell.execute_reply.started":"2024-11-14T14:10:58.805713Z","shell.execute_reply":"2024-11-14T14:10:59.130197Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import numpy as np\n# import pandas as pd\n# import ast\n# import re\n\n# # Example of how to preprocess the 'ppg_filtered_data' column\n# def preprocess_ppg_data(df):\n#     for i in range(len(df)):\n#         try:\n#             ppg_str = df['ppg_filtered_data'].iloc[i]\n#             # Remove any extraneous spaces, line breaks, and ellipses\n#             ppg_str = re.sub(r'\\s+', ',', ppg_str.replace(\"...\", \"\"))\n#             # Use ast.literal_eval to safely evaluate as a list\n#             ppg_list = np.array(ast.literal_eval(ppg_str), dtype=float)\n#             # Replace the string with the actual list of floats\n#             df.at[i, 'ppg_filtered_data'] = ppg_list\n#         except (ValueError, SyntaxError, TypeError) as e:\n#             print(f\"Error converting PPG data at index {i}: {e}\")\n#             continue\n\n# # Call the function on the dataframe\n# preprocess_ppg_data(preprocessed_dataframe)\n\n# Confirm the conversion worked by printing the first row\nprint(preprocessed_dataframe['ppg_filtered_data'].iloc[0])\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T12:14:31.966664Z","iopub.execute_input":"2024-11-14T12:14:31.967064Z","iopub.status.idle":"2024-11-14T12:14:31.974702Z","shell.execute_reply.started":"2024-11-14T12:14:31.967026Z","shell.execute_reply":"2024-11-14T12:14:31.973569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preprocessed_dataframe.shape","metadata":{"execution":{"iopub.status.busy":"2024-11-14T12:14:55.443499Z","iopub.execute_input":"2024-11-14T12:14:55.443900Z","iopub.status.idle":"2024-11-14T12:14:55.451701Z","shell.execute_reply.started":"2024-11-14T12:14:55.443863Z","shell.execute_reply":"2024-11-14T12:14:55.450591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from scipy.interpolate import interp1d\n# import numpy as np\n# import pandas as pd\n# from scipy.interpolate import interp1d\n# from scipy import signal\n# from numpy import trapz # ORIGINALLY USED FROM SCIPY.INTEGRATE IMPORT TRAPZ WHICH DID NOT WORK\n# import matplotlib.pyplot as plt\n\n# # Assuming preprocessed_dataframe is already loaded\n\n# # Interpolate the PPG data\n# ppg_interpolated = []\n# for i in range(len(preprocessed_dataframe)):\n#     ppg_signal = preprocessed_dataframe['ppg_filtered_data'].iloc[i]  # Get the PPG signal for each subject/video\n#     x = np.cumsum(ppg_signal) / 1000.0  # Cumulative sum of PPG signal (time base)\n#     f = interp1d(x, ppg_signal, kind='cubic', fill_value=\"extrapolate\")  # Interpolation function\n#     fs = 4.0  # New sampling frequency\n#     steps = 1 / fs\n\n#     # Sample from the interpolation function at the new time points\n#     xx = np.arange(1, np.max(x), steps)\n#     ppg_interpolated.append(f(xx))\n\n# # Check dimensions of interpolated data\n# print(len(ppg_interpolated), ppg_interpolated[0].shape)\n\n# # Plot original and interpolated PPG signals for comparison\n# plt.plot(preprocessed_dataframe['ppg_filtered_data'].iloc[0], label='Original PPG Data')\n# plt.plot(ppg_interpolated[0], label='Interpolated PPG Data')\n# plt.xlabel('Time')\n# plt.ylabel('PPG Signal')\n# plt.title('Original and Interpolated PPG Data')\n# plt.legend()\n# plt.show()\n\n# # Frequency domain function to calculate frequency features\n# def frequency_domain(ppg_signal, fs=4):\n#     # Estimate the spectral density using Welch's method\n#     fxx, pxx = signal.welch(x=ppg_signal, fs=fs)\n\n#     # Segment frequencies into bands\n#     cond_vlf = (fxx >= 0) & (fxx < 0.04)\n#     cond_lf = (fxx >= 0.04) & (fxx < 0.15)\n#     cond_hf = (fxx >= 0.15) & (fxx < 0.4)\n\n#     # Calculate power in each band by integrating the spectral density\n#     vlf = trapz(pxx[cond_vlf], fxx[cond_vlf])\n#     lf = trapz(pxx[cond_lf], fxx[cond_lf])\n#     hf = trapz(pxx[cond_hf], fxx[cond_hf])\n\n#     # Sum these up to get total power\n#     total_power = vlf + lf + hf\n\n#     # Find which frequency has the most power in each band\n#     peak_vlf = fxx[cond_vlf][np.argmax(pxx[cond_vlf])]\n#     peak_lf = fxx[cond_lf][np.argmax(pxx[cond_lf])]\n#     peak_hf = fxx[cond_hf][np.argmax(pxx[cond_hf])]\n\n#     # Fraction of LF and HF\n#     lf_nu = 100 * lf / (lf + hf)\n#     hf_nu = 100 * hf / (lf + hf)\n\n#     # Return results\n#     result = [vlf, lf, hf, total_power, lf / hf, peak_vlf, peak_lf, peak_hf, lf_nu, hf_nu]\n#     return np.array(result), fxx, pxx\n\n# # Extract frequency features from the interpolated PPG data\n# freq_feat = []\n# for i in range(len(ppg_interpolated)):\n#     results, fxx, pxx = frequency_domain(ppg_interpolated[i])\n#     freq_feat.append(results)\n\n# # Convert list to numpy array and create a DataFrame with frequency features\n# freq_col = ['vlf', 'lf', 'hf', 'tot_pow', 'lf_hf_ratio', 'peak_vlf', 'peak_lf', 'peak_hf', 'lf_nu', 'hf_nu']\n# freq_features = pd.DataFrame(freq_feat, columns=freq_col)\n\n# # Add 'subject_id', 'video_id', and 'arousal_valence_label' to the frequency features DataFrame\n# freq_features['subject_id'] = preprocessed_dataframe['subject_id']\n# freq_features['video_id'] = preprocessed_dataframe['video_id']\n# freq_features['arousal_valence_label'] = preprocessed_dataframe['arousal_valence_label']\n\n# # Optionally, check the result\n# print(freq_features.head())\n\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T12:15:03.048334Z","iopub.execute_input":"2024-11-14T12:15:03.049123Z","iopub.status.idle":"2024-11-14T12:15:03.420705Z","shell.execute_reply.started":"2024-11-14T12:15:03.049081Z","shell.execute_reply":"2024-11-14T12:15:03.419390Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_intervals_dataframe.shape","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:33:25.915484Z","iopub.execute_input":"2024-11-14T14:33:25.915961Z","iopub.status.idle":"2024-11-14T14:33:25.925028Z","shell.execute_reply.started":"2024-11-14T14:33:25.915915Z","shell.execute_reply":"2024-11-14T14:33:25.923916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Without Savgol filter","metadata":{}},{"cell_type":"code","source":"from scipy.interpolate import interp1d\nimport numpy as np\nimport pandas as pd\nfrom scipy.interpolate import interp1d\nfrom scipy import signal\nfrom scipy.signal import savgol_filter\nfrom numpy import trapz # ORIGINALLY USED FROM SCIPY.INTEGRATE IMPORT TRAPZ WHICH DID NOT WORK\nimport matplotlib.pyplot as plt\n\n\n\n\n# Function to apply Savitzky-Golay filter on ppg_data column\ndef preprocess_ppg_data_with_savgol(df):\n    # Convert 'ppg_data' to list of floats if in string format\n    df['ppg_data'] = df['ppg_data'].apply(lambda x: np.array(list(map(float, x.split(',')))) if isinstance(x, str) else x)\n\n    # Apply Savitzky-Golay filter and store in 'ppg_filtered_data'\n    df['ppg_filtered_data'] = df['ppg_data'].apply(lambda ppg: savgol_filter(ppg, window_length=5, polyorder=3))\n\n    return df\n\n# Apply preprocessing function to create 'ppg_filtered_data' column\npreprocessed_dataframe_new = preprocess_ppg_data_with_savgol(data_intervals_dataframe)\n\n# Verify the result\nprint(preprocessed_dataframe_new[['ppg_data', 'ppg_filtered_data']].head())\n# Apply preprocessing function to create 'ppg_filtered_data' column\npreprocessed_dataframe_new = preprocess_ppg_data_with_savgol(data_intervals_dataframe)\n\n# Step 2: Interpolate and extract frequency features from 'ppg_filtered_data'\n# Interpolation function for PPG signal\ndef interpolate_ppg(ppg_signal):\n    # Define a time array based on a constant sampling interval (100 Hz)\n    x = np.linspace(0, len(ppg_signal) / 100.0, num=len(ppg_signal))  # 100 Hz sampling\n    f = interp1d(x, ppg_signal, kind='cubic', fill_value=\"extrapolate\")\n    \n    # Define new time points for the interpolated signal (4 Hz sampling)\n    fs = 4.0  # New sampling frequency\n    new_x = np.arange(0, x[-1], 1 / fs)\n    \n    # Interpolate the signal at the new time points\n    interpolated_signal = f(new_x)\n    return interpolated_signal\n\n# Frequency domain function to calculate frequency features\ndef frequency_domain(ppg_signal, fs=4):\n    fxx, pxx = signal.welch(x=ppg_signal, fs=fs)\n    cond_vlf = (fxx >= 0) & (fxx < 0.04)\n    cond_lf = (fxx >= 0.04) & (fxx < 0.15)\n    cond_hf = (fxx >= 0.15) & (fxx < 0.4)\n    vlf = trapz(pxx[cond_vlf], fxx[cond_vlf])\n    lf = trapz(pxx[cond_lf], fxx[cond_lf])\n    hf = trapz(pxx[cond_hf], fxx[cond_hf])\n    total_power = vlf + lf + hf\n    peak_vlf = fxx[cond_vlf][np.argmax(pxx[cond_vlf])] if np.any(cond_vlf) else 0\n    peak_lf = fxx[cond_lf][np.argmax(pxx[cond_lf])] if np.any(cond_lf) else 0\n    peak_hf = fxx[cond_hf][np.argmax(pxx[cond_hf])] if np.any(cond_hf) else 0\n    lf_nu = 100 * lf / (lf + hf) if (lf + hf) != 0 else 0\n    hf_nu = 100 * hf / (lf + hf) if (lf + hf) != 0 else 0\n    return [vlf, lf, hf, total_power, lf / hf if hf != 0 else 0, peak_vlf, peak_lf, peak_hf, lf_nu, hf_nu]\n\n# Step 3: Interpolate and extract frequency features for each PPG filtered signal\nppg_interpolated = preprocessed_dataframe_new['ppg_filtered_data'].apply(interpolate_ppg)\n# Verify the result\nprint(ppg_interpolated.head())\n\nfreq_feat = ppg_interpolated.apply(frequency_domain)\n\n# Convert frequency features to a DataFrame and add identifiers\nfreq_col = ['vlf', 'lf', 'hf', 'tot_pow', 'lf_hf_ratio', 'peak_vlf', 'peak_lf', 'peak_hf', 'lf_nu', 'hf_nu']\nfreq_features = pd.DataFrame(freq_feat.tolist(), columns=freq_col)\nfreq_features['subject_id'] = preprocessed_dataframe_new['subject_id']\nfreq_features['video_id'] = preprocessed_dataframe_new['video_id']\nfreq_features['arousal_valence_label'] = preprocessed_dataframe_new['arousal_valence_label']\n\n# Optional: Check the frequency features\nprint(freq_features.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:39:11.299102Z","iopub.execute_input":"2024-11-14T14:39:11.299941Z","iopub.status.idle":"2024-11-14T14:39:15.988198Z","shell.execute_reply.started":"2024-11-14T14:39:11.299898Z","shell.execute_reply":"2024-11-14T14:39:15.987382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save frequency features to csv file","metadata":{}},{"cell_type":"code","source":"\n\n# Save the DataFrame to a CSV file\nfreq_features.to_csv('ppg_freq_features.csv', index=False)\n\nprint(\"Data saved to ppg_freq_features.csv\")\n\n# Specify the path to the CSV file\nfile_path = '/kaggle/working/ppg_freq_features.csv'\n\n# Read the CSV file into a DataFrame\nppg_freq_features = pd.read_csv(file_path)\n\n\nprint(ppg_freq_features.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:52:30.277667Z","iopub.execute_input":"2024-11-14T14:52:30.278333Z","iopub.status.idle":"2024-11-14T14:52:30.344121Z","shell.execute_reply.started":"2024-11-14T14:52:30.278291Z","shell.execute_reply":"2024-11-14T14:52:30.343239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ppg_freq_features.shape","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:52:46.903611Z","iopub.execute_input":"2024-11-14T14:52:46.904476Z","iopub.status.idle":"2024-11-14T14:52:46.910164Z","shell.execute_reply.started":"2024-11-14T14:52:46.904429Z","shell.execute_reply":"2024-11-14T14:52:46.909361Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(time_features)","metadata":{"execution":{"iopub.status.busy":"2024-11-14T14:49:03.944200Z","iopub.execute_input":"2024-11-14T14:49:03.945106Z","iopub.status.idle":"2024-11-14T14:49:03.962249Z","shell.execute_reply.started":"2024-11-14T14:49:03.945063Z","shell.execute_reply":"2024-11-14T14:49:03.961347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ppg_freq_features.columns","metadata":{"execution":{"iopub.status.busy":"2024-11-14T15:03:41.959092Z","iopub.execute_input":"2024-11-14T15:03:41.959490Z","iopub.status.idle":"2024-11-14T15:03:41.966646Z","shell.execute_reply.started":"2024-11-14T15:03:41.959452Z","shell.execute_reply":"2024-11-14T15:03:41.965764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"time_features.columns","metadata":{"execution":{"iopub.status.busy":"2024-11-14T15:04:58.256882Z","iopub.execute_input":"2024-11-14T15:04:58.257948Z","iopub.status.idle":"2024-11-14T15:04:58.265548Z","shell.execute_reply.started":"2024-11-14T15:04:58.257886Z","shell.execute_reply":"2024-11-14T15:04:58.264476Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Concatenate time and frequency features of PPG","metadata":{}},{"cell_type":"code","source":"# Drop common columns from ppg_freq_features dataframe\nppg_freq_features_unique = ppg_freq_features.drop(columns=['subject_id', 'video_id', 'arousal_valence_label'])\n\n# Concatenate the dataframes\nppg_features_extracted = pd.concat([time_features, ppg_freq_features_unique], axis=1)\n\n# Verify the result\nprint(ppg_features_extracted.columns)\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T15:07:58.819212Z","iopub.execute_input":"2024-11-14T15:07:58.820160Z","iopub.status.idle":"2024-11-14T15:07:58.828402Z","shell.execute_reply.started":"2024-11-14T15:07:58.820115Z","shell.execute_reply":"2024-11-14T15:07:58.827462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# READ ALL PPG EXTRACTED FEATURES CSV HERE","metadata":{}},{"cell_type":"code","source":"\nprint(ppg_features_extracted.head())\n\nppg_features_extracted.shape\n\nprint(\"===============================================\")\n\nppg_features_extracted.to_csv(\"ppg_all_features.csv\", index=False)\n\n\nprint(\"Data saved to ppg_all_features.csv\")\n\n# Specify the path to the CSV file\nfile_path = '/kaggle/working/ppg_all_features.csv'\n\n# Read the CSV file into a DataFrame\nppg_all_features = pd.read_csv(file_path)\n\n\nprint(ppg_all_features.head())\n\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T15:12:36.862764Z","iopub.execute_input":"2024-11-14T15:12:36.863488Z","iopub.status.idle":"2024-11-14T15:12:37.029168Z","shell.execute_reply.started":"2024-11-14T15:12:36.863448Z","shell.execute_reply":"2024-11-14T15:12:37.028228Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = ppg_all_features['arousal_valence_label']\nprint(labels)\n\nppg_only_features =ppg_all_features.drop(columns=['subject_id', 'video_id', 'arousal_valence_label'])\nprint(ppg_only_features.head())","metadata":{"execution":{"iopub.status.busy":"2024-11-14T15:29:24.757949Z","iopub.execute_input":"2024-11-14T15:29:24.758360Z","iopub.status.idle":"2024-11-14T15:29:24.778103Z","shell.execute_reply.started":"2024-11-14T15:29:24.758320Z","shell.execute_reply":"2024-11-14T15:29:24.776696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EXTRACT GSR FEATURES","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n\n# Specify the path to the CSV file\nfile_path = '/kaggle/input/data-intervals-not-normalized-with-labels/data_intervals_not_normalized1.csv'\n\n# Read the CSV file into a DataFrame\ndata_intervals_dataframe = pd.read_csv(file_path)\n\n# Display the first few rows to verify\nprint(data_intervals_dataframe.head())","metadata":{"execution":{"iopub.status.busy":"2024-11-15T03:34:33.551566Z","iopub.execute_input":"2024-11-15T03:34:33.552006Z","iopub.status.idle":"2024-11-15T03:34:35.139214Z","shell.execute_reply.started":"2024-11-15T03:34:33.551962Z","shell.execute_reply":"2024-11-15T03:34:35.138135Z"},"trusted":true},"execution_count":2,"outputs":[{"name":"stdout","text":"   subject_id  video_id                                           gsr_data  \\\n0           7         0  179125.171875,178570.375,179391.03125,181556.2...   \n1           7         1  182172.671875,182666.59375,183080.09375,184354...   \n2           7         2  168857.21875,168781.234375,169132.53125,169823...   \n3           7         3  178895.96875,178088.4375,177970.546875,177919....   \n4           7         4  195028.421875,195278.421875,195498.46875,19572...   \n\n                                            ppg_data  valence  arousal  \\\n0  612293.0,611442.0,610770.0,610083.0,609360.0,6...        4        5   \n1  551232.0,551091.0,550905.0,550746.0,550549.0,5...        3        5   \n2  605678.0,605853.0,606119.0,606351.0,606579.0,6...        4        5   \n3  565274.0,565598.0,566007.0,566224.0,566272.0,5...        5        6   \n4  549417.0,549378.0,549404.0,549342.0,549404.0,5...        6        6   \n\n  arousal_level valence_level arousal_valence_label  \n0             M             M                  AMVM  \n1             M             L                  AMVL  \n2             M             M                  AMVM  \n3             M             M                  AMVM  \n4             M             M                  AMVM  \n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Apply CWT to GSR","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"# Print the first value in the 'gsr_data' column (first row) and its type\nfirst_value = data_intervals_dataframe['gsr_data'].iloc[0]\nprint(\"First value in 'gsr_data':\", first_value)\nprint(\"Type of the first value:\", type(first_value))\n\n# Print the third value in the 'gsr_data' column (third row) and its type\nthird_value = data_intervals_dataframe['gsr_data'].iloc[2]\nprint(\"Third value in 'gsr_data':\", third_value)\nprint(\"Type of the third value:\", type(third_value))\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T02:05:53.821361Z","iopub.execute_input":"2024-11-15T02:05:53.821898Z","iopub.status.idle":"2024-11-15T02:05:53.830215Z","shell.execute_reply.started":"2024-11-15T02:05:53.821849Z","shell.execute_reply":"2024-11-15T02:05:53.828955Z"},"trusted":true},"execution_count":2,"outputs":[{"name":"stdout","text":"First value in 'gsr_data': 179125.171875,178570.375,179391.03125,181556.21875,182420.515625,183646.203125,183727.078125,183940.0,184140.109375,184302.125,184497.453125,184425.84375,184151.828125,183712.84375,183200.3125,182930.90625,182558.046875,182371.484375,182351.875,182348.90625,182571.71875,182762.59375,182850.78125,183005.96875,183131.21875,183223.3125,183341.90625,183501.390625,183623.203125,183718.921875,183845.875,183990.0625,184070.0625,184106.53125,184181.75,184225.921875,184179.484375,184101.109375,184012.8125,183851.015625,183785.625,183725.21875,183676.765625,183682.390625,183646.03125,183785.234375,183910.671875,183894.5,184009.25,184028.03125,184072.859375,184162.5625,184114.109375,184188.609375,184215.5,184219.015625,184314.234375,184334.859375,184143.5625,183615.875,182805.71875,181927.59375,180957.71875,180380.265625,180069.375,179868.71875,179733.6875,179904.6875,180134.609375,180490.90625,180799.6875,181055.21875,181257.625,181439.09375,181634.703125,181800.921875,181920.0625,182107.703125,182163.03125,182333.625,182389.96875,182461.3125,182565.28125,182543.171875,182640.984375,182654.921875,182691.265625,182827.484375,182866.15625,182997.203125,183045.8125,183130.515625,183130.046875\nType of the first value: <class 'str'>\nThird value in 'gsr_data': 168857.21875,168781.234375,169132.53125,169823.0,170710.34375,171388.953125,172187.515625,172716.078125,173357.40625,173904.28125,174323.5625,174718.265625,175014.71875,175309.296875,175530.109375,175777.78125,175984.109375,176195.375,176381.4375,176576.296875,176749.59375,176954.421875,177131.3125,177294.34375,177346.453125,177531.609375,177766.203125,177894.71875,177950.171875,178103.15625,178181.046875,178255.0,178363.609375,178503.625,178543.53125,178680.40625,178786.609375,178833.0625,178843.828125,179016.65625,179132.59375,179219.21875,179301.3125,179397.328125,179474.671875,179588.25,179678.40625,179676.828125,179090.765625,177644.015625,175528.703125,173140.734375,171016.78125,169359.78125,168094.109375,167512.359375,167284.734375,167543.796875,168265.234375,169093.046875,169971.828125,170824.0625,171611.28125,172348.578125,172893.34375,173391.296875,173790.359375,174225.703125,174506.8125,174826.515625,175100.28125,175360.75,175597.671875,175794.1875,176006.546875,176196.96875,176361.34375,176525.625,176728.859375,176877.265625,177051.09375,177108.890625,177245.3125,177345.75,177275.859375,176441.875,175111.859375,173636.34375,172269.125,171142.0,170401.078125,169992.875,169993.890625,170285.96875,170852.0,171463.015625,172214.46875,172766.828125,173270.65625,173752.75,173954.890625,173402.5625,171716.21875,169250.234375,166271.671875,163741.578125,161828.671875,160911.34375,160645.578125,160936.40625,161622.578125,162663.734375,163788.28125,164938.421875,165878.953125,166861.53125,167621.125,168391.609375,169140.03125,169697.65625,170152.859375,170501.0625,170859.03125,171183.90625,171558.15625,171780.59375,172048.140625,172277.703125,172467.484375\nType of the third value: <class 'str'>\n","output_type":"stream"}]},{"cell_type":"code","source":"# # Print the first value in the 'gsr_data' column (first row) and its type\n# first_value = data_intervals_dataframe['gsr_data'].iloc[0]\n# print(\"First value in 'gsr_data':\", first_value)\n# print(\"Type of the first value:\", type(first_value))\n\n# # Print the third value in the 'gsr_data' column (third row) and its type\n# third_value = data_intervals_dataframe['gsr_data'].iloc[2]\n# print(\"Third value in 'gsr_data':\", third_value)\n# print(\"Type of the third value:\", type(third_value))\n\n\n# Print the third value in the 'gsr_data' column (third row) and its type\ndataframe_columns = data_intervals_dataframe.columns\nprint(dataframe_columns)\n\nppg_third_value = data_intervals_dataframe['ppg_data'].iloc[2]\nprint(ppg_third_value)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T02:08:32.333588Z","iopub.execute_input":"2024-11-15T02:08:32.335205Z","iopub.status.idle":"2024-11-15T02:08:32.345404Z","shell.execute_reply.started":"2024-11-15T02:08:32.335132Z","shell.execute_reply":"2024-11-15T02:08:32.343703Z"},"trusted":true},"execution_count":6,"outputs":[{"name":"stdout","text":"Index(['subject_id', 'video_id', 'gsr_data', 'ppg_data', 'valence', 'arousal',\n       'arousal_level', 'valence_level', 'arousal_valence_label'],\n      dtype='object')\n605678.0,605853.0,606119.0,606351.0,606579.0,606769.0,607007.0,607253.0,607461.0,607620.0,607842.0,608037.0,608306.0,608448.0,608667.0,608855.0,609069.0,609291.0,609425.0,609642.0,609932.0,610125.0,610256.0,610579.0,610784.0,611056.0,611287.0,611514.0,611654.0,611746.0,611636.0,611449.0,611136.0,610584.0,610026.0,609417.0,608837.0,608262.0,607743.0,607359.0,607022.0,606744.0,606540.0,606445.0,606329.0,606268.0,606358.0,606327.0,606375.0,606543.0,606663.0,606834.0,606958.0,607096.0,607212.0,607329.0,607455.0,607436.0,607453.0,607463.0,607457.0,607437.0,607499.0,607558.0,607631.0,607699.0,607762.0,607910.0,608074.0,608214.0,608341.0,608603.0,608765.0,608952.0,609168.0,609381.0,609607.0,609818.0,610038.0,610252.0,610372.0,610683.0,610914.0,611065.0,611281.0,611536.0,611779.0,611920.0,612183.0,612342.0,612593.0,612763.0,612978.0,613172.0,613388.0,613648.0,613747.0,613946.0,614198.0,614475.0,614708.0,614886.0,615178.0,615468.0,615711.0,615913.0,616041.0,616133.0,616019.0,615753.0,615466.0,614929.0,614316.0,613761.0,613129.0,612544.0,612025.0,611578.0,611249.0,610910.0,610662.0,610522.0,610372.0,610222.0,610175.0,610137.0,610105.0,610129.0,610244.0,610315.0,610416.0,610566.0,610600.0,610745.0,610873.0,610850.0,610896.0,610871.0,610893.0,610936.0,610927.0,610926.0,610949.0,610983.0,611118.0,611243.0,611407.0,611405.0,611604.0,611728.0,611926.0,612116.0,612219.0,612454.0,612651.0,612857.0,613012.0,613192.0,613319.0,613557.0,613736.0,613923.0,614125.0,614315.0,614503.0,614727.0,614905.0,615061.0,615266.0,615456.0,615654.0,615816.0,615935.0,616184.0,616389.0,616514.0,616704.0,616886.0,617140.0,617359.0,617552.0,617776.0,618015.0,618201.0,618433.0,618609.0,618839.0,619035.0,619254.0,619448.0,619730.0,619963.0,620163.0,620379.0,620623.0,620817.0,621010.0,621020.0,620935.0,620653.0,620218.0,619689.0,619063.0,618376.0,617645.0,616926.0,616308.0,615754.0,615323.0,614949.0,614529.0,614285.0,614029.0,613725.0,613539.0,613362.0,613153.0,613052.0,612983.0,612902.0,612858.0,612804.0,612874.0,612814.0,612808.0,612719.0,612673.0,612566.0,612468.0,612408.0,612352.0,612284.0,612223.0,612168.0,612153.0,612141.0,612181.0,612126.0,612292.0,612237.0,612346.0,612436.0,612460.0,612595.0,612718.0,612837.0,612987.0,613023.0,613155.0,613336.0,613451.0,613544.0,613708.0,613839.0,613924.0,613997.0,614152.0,614264.0,614356.0,614463.0,614640.0,614747.0,614902.0,615015.0,615123.0,615214.0,615432.0,615516.0,615662.0,615822.0,615919.0,616069.0,616234.0,616432.0,616541.0,616661.0,616827.0,617006.0,617084.0,617281.0,617474.0,617615.0,617779.0,617958.0,618100.0,618333.0,618528.0,618755.0,618901.0,618976.0,618943.0,618740.0,618420.0,617868.0,617254.0,616501.0,615715.0,614910.0,614135.0,613452.0,612807.0,612263.0,611794.0,611378.0,611058.0,610774.0,610415.0,610119.0,609907.0,609715.0,609540.0,609359.0,609285.0,609243.0,609160.0,609056.0,609035.0,608944.0,608916.0,608773.0,608668.0,608559.0,608397.0,608280.0,608188.0,608074.0,607919.0,607913.0,607885.0,607861.0,607913.0,607897.0,607912.0,607971.0,608105.0,608156.0,608303.0,608343.0,608448.0,608623.0,608658.0,608755.0,608978.0,609085.0,609172.0,609342.0,609462.0,609610.0,609660.0,609849.0,609982.0,610074.0,610267.0,610419.0,610575.0,610642.0,610884.0,610978.0,611119.0,611294.0,611479.0,611706.0,611838.0,612043.0,612199.0,612339.0,612540.0,612743.0,612877.0,613080.0,613261.0,613462.0,613682.0,613825.0,614071.0,614261.0,614404.0,614605.0,614777.0,615030.0,615251.0,615451.0,615628.0,615893.0,616085.0,616199.0,616289.0,616272.0,615993.0,615596.0,615032.0,614312.0,613610.0,612792.0,611982.0,611219.0,610591.0,610004.0,609495.0,608982.0,608572.0,608279.0,608059.0,607749.0,607553.0,607399.0,607235.0,607228.0,607142.0,607110.0,607085.0,607098.0,607069.0,607007.0,607036.0,606973.0,606927.0,606792.0,606736.0,606646.0,606483.0,606330.0,606305.0,606265.0,606264.0,606240.0,606264.0,606309.0,606348.0,606448.0,606507.0,606635.0,606741.0,606842.0,607026.0,607137.0,607314.0,607427.0,607567.0,607740.0,607879.0,608064.0,608185.0,608347.0,608509.0,608723.0,608839.0,608986.0,609137.0,609347.0,609442.0,609573.0,609715.0,609883.0,610054.0,610289.0,610395.0,610611.0,610749.0,610883.0,611086.0,611320.0,611503.0,611640.0,611865.0,612041.0,612323.0,612514.0,612702.0,612929.0,613139.0,613392.0,613605.0,613772.0,613789.0,613759.0,613460.0,613069.0,612481.0,611848.0,611152.0,610310.0,609615.0,608932.0,608344.0,607808.0,607404.0,607025.0,606739.0,606537.0,606350.0,606204.0,606083.0,606004.0,605972.0,606041.0,606027.0,606099.0,606069.0,606174.0,606197.0,606207.0,606171.0,606147.0,606085.0,606057.0,605973.0,605862.0,605839.0,605765.0,605711.0,605689.0,605649.0,605760.0,605762.0,605898.0,606320.0,604453.0,606130.0,606280.0,606470.0,606521.0,606713.0,606920.0,607069.0,607337.0,607480.0,607639.0,607767.0,607987.0,608135.0,608307.0,608458.0,608661.0,608861.0,608997.0,609163.0,609337.0,609458.0,609661.0,609862.0,609976.0,610211.0,610361.0,610574.0,610759.0,610951.0,611099.0,611334.0,611498.0,611673.0,611823.0,612084.0,612292.0,612508.0,612714.0,612970.0,613172.0,613434.0,613647.0,613914.0,614134.0,614241.0,614335.0,614209.0,613975.0,613512.0,612956.0,612334.0,611685.0,610973.0,610220.0,609625.0,609105.0,608607.0,608184.0,607889.0,607630.0,607509.0,607288.0,607258.0,607206.0,607192.0,607135.0,607200.0,607328.0,607374.0,607461.0,607519.0,607620.0,607663.0,607665.0,607651.0,607703.0,607580.0,607574.0,607478.0,607404.0,607370.0,607315.0,607347.0,607376.0,607427.0,607424.0,607580.0,607658.0,607738.0,607910.0,608092.0,608257.0,608448.0,608597.0,608750.0,609002.0,609843.0,610366.0,610175.0,610692.0,608104.0,610125.0,610385.0,610497.0,610721.0,610923.0,611092.0,611291.0,611464.0,611631.0,611881.0,611992.0,612184.0,612395.0,612561.0,612801.0,613015.0,613166.0,613356.0,613601.0,613799.0,614042.0,614258.0,614418.0,614582.0,614801.0,615021.0,615240.0,615527.0,615691.0,615917.0,616156.0,616407.0,616633.0,616914.0,617187.0,617408.0,617606.0,617745.0,617703.0,617523.0,617187.0,616693.0,616076.0,615313.0,614567.0,613851.0,613078.0,612396.0,611839.0,611306.0,610971.0,610511.0,610217.0,610000.0,609874.0,609688.0,609601.0,609539.0,609435.0,609459.0,609441.0,609483.0,609488.0,609548.0,609572.0,609542.0,609530.0,609584.0,609458.0,609422.0,609326.0,609272.0,609190.0,609123.0,609075.0,609040.0,609083.0,609060.0,609058.0,609183.0,609311.0,609406.0,609533.0,609626.0,609722.0,609888.0,610023.0,610231.0,610432.0,610595.0,610767.0,610978.0,611106.0,611302.0,611453.0,611625.0,611888.0,612006.0,612143.0,613661.0,613431.0,612761.0,612948.0,612966.0,613190.0,613359.0,613567.0,613771.0,613984.0,614158.0,614356.0,614530.0,614727.0,614906.0,615091.0,615309.0,615532.0,615686.0,615853.0,616155.0,616354.0,616589.0,616737.0,617050.0,617293.0,617518.0,617564.0,617642.0,617422.0,617139.0,616668.0,616059.0,615446.0,614701.0,613945.0,613231.0,612514.0,611988.0,611513.0,611113.0,610708.0,610522.0,610294.0,610099.0,610012.0,609889.0,609819.0,609791.0,609820.0,609833.0,609899.0,609930.0,609992.0,610037.0,610046.0,610013.0,609992.0,609991.0,609960.0,609837.0,609838.0,609802.0,609648.0,609692.0,609683.0,609703.0,609709.0,609817.0,609819.0,609928.0,609981.0,610145.0,610289.0,610397.0,610577.0,610713.0,610838.0,611070.0,611251.0,611494.0,611605.0,611816.0,612020.0,612229.0,612347.0,612603.0,612728.0,612945.0,613066.0,613369.0,613470.0,613639.0,613809.0,614025.0,615470.0,615537.0,615613.0,615975.0,614336.0,614744.0,615515.0,616730.0,617245.0,615822.0,616059.0,616218.0,616434.0,616634.0,616841.0,617081.0,617289.0,617498.0,617690.0,617719.0,617704.0,617454.0,617127.0,616585.0,615967.0,615369.0,614703.0,614044.0,613371.0,612738.0,612202.0,611777.0,611467.0,611153.0,610935.0,610770.0,610666.0,610574.0,610466.0,610402.0,610511.0,610538.0,610577.0,610651.0,610704.0,610739.0,610731.0,610663.0,610648.0,610580.0,610550.0,610404.0,610324.0,610176.0,610115.0,610063.0,610005.0,609956.0,609916.0,609919.0,609878.0,610006.0,610057.0,610193.0,610278.0,610441.0,610438.0,610658.0,610766.0,610916.0,611030.0,611147.0,611336.0,611539.0,611681.0,611831.0,611978.0,612184.0,612252.0,612427.0,612563.0,612656.0,612821.0,612991.0,613080.0,613226.0,613368.0,613486.0,613695.0,613874.0,614025.0,614183.0,614465.0,614580.0,614764.0,614959.0,615063.0,615067.0,615495.0,615223.0,614933.0,614356.0,613112.0,611302.0,610615.0,610036.0,609343.0,610013.0,609534.0,609319.0,608837.0,608568.0,608363.0,608250.0,608134.0,608105.0,608077.0,608104.0,608121.0,608216.0,608183.0,608320.0,608393.0,608379.0,608446.0,608477.0,608377.0,608347.0,608269.0,608156.0,608122.0,608069.0,607974.0,607951.0,608023.0,607992.0,608037.0,608106.0,608216.0,608265.0,608388.0,608573.0,608677.0,608852.0,608982.0,609162.0,609335.0,609443.0,609626.0,609813.0,610030.0,610194.0,610387.0,610538.0,610757.0,610905.0,611070.0,611240.0,611320.0,611521.0,611712.0,611846.0,611950.0,612160.0,612342.0,612532.0,612722.0,612832.0,612991.0,613221.0,613425.0,613637.0,613819.0,613948.0,613928.0,613781.0,613378.0,612874.0,612254.0,611597.0,610888.0,610059.0,609280.0,608589.0,607982.0,607414.0,606943.0,606582.0,606264.0,605930.0,605815.0,605540.0,605457.0,605310.0,605212.0,605204.0,605177.0,605185.0,605269.0,605235.0,605240.0,605250.0,603845.0,605219.0,603746.0,605065.0,605381.0,605316.0,605400.0,604302.0,603972.0,604693.0,604702.0,604625.0,604727.0,604815.0,604895.0,605002.0,605136.0,605341.0,605439.0,605624.0,605773.0,605916.0,606118.0,606327.0,606421.0,606590.0,606832.0,606933.0,607131.0,607334.0,607475.0,607628.0,607724.0,607976.0,608083.0,608209.0,608464.0,608599.0,608758.0,608923.0,609124.0,609267.0,609487.0,609643.0,609801.0,609997.0,610228.0,610402.0,610637.0,610905.0,611046.0,611221.0,611339.0,611374.0,611202.0,610775.0,610297.0,609658.0,608902.0,608173.0,607421.0,606666.0,605961.0,605342.0,604810.0,604286.0,603925.0,603624.0,603294.0,603016.0,602811.0,602619.0,602435.0,602342.0,602283.0,602296.0,602316.0,602325.0,602321.0,602290.0,602405.0,602344.0,602311.0,602292.0,602270.0,602241.0,602245.0,602132.0,602382.0,601973.0,602099.0,601997.0,602399.0,602812.0,602949.0,603116.0,603186.0,603270.0,603386.0,603300.0,603504.0,603691.0,603852.0,604052.0,604255.0,604447.0,604678.0,604901.0,605013.0,605221.0,605442.0,605616.0,605799.0,605971.0,606212.0,606393.0,606574.0,606783.0,606968.0,607171.0,607449.0,607617.0,607776.0,607994.0,608156.0,608392.0,608586.0,608759.0,609053.0,609250.0,609455.0,609690.0,609943.0,610207.0,610486.0,610620.0,610814.0,610786.0,610631.0,610285.0,609765.0,609172.0,608472.0,607745.0,606965.0,606257.0,605627.0,605101.0,604628.0,604247.0,603903.0,603635.0,603385.0,603168.0,602945.0,602782.0,602710.0,602608.0,602569.0,602574.0,602630.0,602594.0,602662.0,602722.0,602733.0,602739.0,602758.0,602761.0,602758.0,602775.0,602703.0,602737.0,602716.0,602735.0,602815.0,602863.0,602991.0,603108.0,603195.0,603322.0,603496.0,603621.0,603907.0,604018.0,604231.0,604353.0,604608.0,604781.0,605032.0,605101.0,606344.0,606573.0,605858.0,607062.0,606108.0,606384.0,606565.0,606747.0,606979.0,607165.0,607333.0,607535.0,607800.0,608070.0,608202.0,608425.0,608611.0,608799.0,609020.0,609236.0,609429.0,609707.0,609887.0,610096.0,610299.0,610531.0,610762.0,611007.0,611218.0,611492.0,611710.0,611922.0,612162.0,612401.0,612708.0,612929.0,613081.0,613375.0,613387.0,613292.0,613016.0,612578.0,612007.0,611304.0,610554.0,609890.0,609180.0,608568.0,607907.0,607484.0,607105.0,606730.0,606517.0,606268.0,606055.0,605946.0,605795.0,605716.0,605627.0,605571.0,605603.0,605633.0,605667.0,605719.0,605705.0,605760.0,605730.0,605763.0,605749.0,605740.0,605646.0,605624.0,605533.0,605617.0,605589.0,605599.0,605651.0,605628.0,605683.0,605901.0,605970.0,606104.0,606228.0,606352.0,606518.0,606726.0,606828.0,607023.0,607189.0,607438.0,607619.0,607790.0,607962.0,608139.0,608328.0,608502.0,607636.0,609652.0,609699.0,610046.0,608077.0,608183.0,608489.0,608623.0,610105.0,610356.0,610585.0,610660.0,610886.0,611092.0,611320.0,611497.0,611715.0,611921.0,612117.0,612335.0,612524.0,612709.0,612895.0,613088.0,613364.0,613521.0,613730.0,613957.0,614154.0,614443.0,614643.0,614903.0,615053.0,615298.0,615486.0,615696.0,615718.0,615531.0,615273.0,614804.0,614244.0,613694.0,612988.0,612303.0,611728.0,611033.0,610513.0,610110.0,609782.0,609499.0,609227.0,609086.0,608954.0,608829.0,608730.0,608704.0,608695.0,608739.0,608812.0,608821.0,608936.0,608916.0,609022.0,609032.0,609037.0,609025.0,609006.0,609002.0,608952.0,608891.0,608855.0,608823.0,608877.0,608900.0,608938.0,608983.0,609060.0,609203.0,609306.0,609494.0,609614.0,609768.0,609906.0,610128.0,610334.0,610540.0,610656.0,610901.0,611130.0,611234.0,611432.0,611628.0,611790.0,612009.0,612177.0,612367.0,612534.0,612735.0,612925.0,613066.0,613284.0,613424.0,613639.0,614860.0,614972.0,615230.0,615260.0,614906.0,613427.0,615332.0,613864.0,615235.0,615493.0,615452.0,615818.0,616289.0,616523.0,616778.0,617027.0,617220.0,617504.0,617714.0,618016.0,618228.0,618366.0,618482.0,618496.0,618323.0,617973.0,617468.0,616852.0,616167.0,615483.0,614772.0,614078.0,613438.0,612867.0,612453.0,611992.0,611603.0,611334.0,611097.0,610847.0,610645.0,610503.0,610350.0,610247.0,610179.0,610154.0,610121.0,610105.0,610082.0,610035.0,609990.0,609962.0,609882.0,609839.0,609752.0,609683.0,609587.0,609519.0,609510.0,609499.0,609481.0,609443.0,609506.0,609597.0,609668.0,609674.0,609808.0,609933.0,610046.0,610198.0,610285.0,610471.0,610637.0,610750.0,610936.0,611102.0,611314.0,611525.0,611678.0,611839.0,612052.0,612242.0,612351.0,612581.0,612769.0,612844.0,613068.0,613189.0,613381.0,613530.0,613684.0,613814.0,613992.0,614208.0,614379.0,614574.0,614767.0,614985.0,615149.0,615395.0,615581.0,615765.0,615926.0,614754.0,616576.0,616720.0,617153.0,616352.0,615681.0,616944.0,616135.0,617683.0,618439.0,618512.0,618575.0,618622.0,618734.0,618762.0,618703.0,618469.0,618019.0,617475.0,616803.0,616023.0,615259.0,614464.0,613787.0,613125.0,612560.0,612023.0,611562.0,611219.0,610847.0,610515.0,610227.0,610081.0,609848.0,609710.0,609581.0,609525.0,609425.0,609417.0,609311.0,609304.0,609221.0,609122.0,609091.0,608943.0,608875.0,608811.0,608631.0,608467.0,608455.0,608298.0,608270.0,608233.0,608208.0,608141.0,608125.0,608110.0,608245.0,608217.0,608313.0,608435.0,608548.0,608605.0,608757.0,608819.0,608986.0,609054.0,609205.0,609342.0,609468.0,609622.0,609748.0,609940.0,610087.0,610242.0,610358.0,610486.0,610611.0,610790.0,610970.0,611088.0,611212.0,611327.0,611516.0,611672.0,611831.0,611961.0,612150.0,612231.0,612420.0,612545.0,612782.0,612916.0,613045.0,612580.0,613988.0,613042.0,612782.0,613051.0,614727.0,614471.0,614701.0,614923.0,615032.0,615119.0,615103.0,614865.0,614516.0,613931.0,613261.0,612537.0,611729.0,610936.0,610219.0,609488.0,608828.0,608292.0,607825.0,607434.0,607100.0,606810.0,606595.0,606397.0,606229.0,606067.0,605987.0,605883.0,605888.0,605893.0,605854.0,605885.0,605862.0,605843.0,605794.0,605636.0,605577.0,605502.0,605343.0,605243.0,605163.0,605071.0,605021.0,604963.0,604923.0,604889.0,604881.0,604889.0,605030.0,605056.0,605141.0,605267.0,605355.0,605451.0,605620.0,605766.0,605916.0,606042.0,606191.0,606345.0,606519.0,606611.0,606793.0,606939.0,607099.0,607271.0,607423.0,607544.0,607686.0,607865.0,607991.0,608200.0,608289.0,608495.0,608642.0,608739.0,608927.0,609084.0,609226.0,609390.0,609531.0,609757.0,609950.0,610084.0,610292.0,610489.0,610653.0,610859.0,611061.0,611235.0,611398.0,611442.0,611351.0,611081.0,610669.0,610936.0,610346.0,608310.0,606360.0,605857.0,606612.0,605408.0,605612.0,604331.0,604146.0,603806.0,603498.0,603297.0,603176.0,603025.0,602917.0,602817.0,602816.0,602846.0,602898.0,602896.0,602964.0,602930.0,602951.0,602910.0,602863.0,602782.0,602702.0,602531.0,602478.0,602347.0,602237.0,602228.0,602153.0,602145.0,602050.0,602137.0,602170.0,602304.0,602382.0,602505.0,602606.0,602738.0,602837.0,602962.0,603193.0,603440.0,603570.0,603783.0,603924.0,604131.0,604321.0,604443.0,604692.0,604864.0,604976.0,605223.0,605392.0,605595.0,605761.0,605945.0,606101.0,606279.0,606423.0,606621.0,606749.0,606975.0,607108.0,607309.0,607537.0,607759.0,607973.0,608139.0,608361.0,608542.0,608675.0,608596.0,608394.0,608008.0,607411.0,606752.0,605867.0,605067.0,604261.0,603460.0,602700.0,602096.0,601481.0,601012.0,600542.0,600173.0,599903.0,599662.0,599420.0,599267.0,599089.0,599010.0,598955.0,598945.0,598960.0,599181.0,598905.0,598943.0,598867.0,598848.0,598828.0,598663.0,598666.0,598500.0,598376.0,598323.0,598247.0,598194.0,598194.0,598196.0,598142.0,598171.0,598242.0,598326.0,598493.0,598587.0,598741.0,598882.0,599067.0,599225.0,599391.0,599552.0,599767.0,599947.0,600081.0,600334.0,600518.0,600649.0,600853.0,601002.0,601250.0,601413.0,601556.0,601695.0,601876.0,602074.0,602243.0,602429.0,602591.0,602818.0,602976.0,603151.0,603392.0,603545.0,603787.0,603966.0,604183.0,604440.0,604662.0,604882.0,605012.0,605054.0,604888.0,604551.0,604054.0,603379.0,602679.0,601878.0,601067.0,600299.0,599622.0,599012.0,598459.0,598118.0,597752.0,597411.0,597118.0,596969.0,596821.0,596621.0,596580.0,596512.0,596474.0,596462.0,596599.0,596587.0,596629.0,596644.0,596667.0,596713.0,596687.0,596683.0,596605.0,596621.0,596581.0,596561.0,596503.0,596517.0,596614.0,596586.0,596607.0,596654.0,596833.0,596956.0,597068.0,597282.0,597487.0,597216.0,598022.0,598033.0,598251.0,598426.0,598653.0,598877.0,599164.0,599306.0,599543.0,599800.0,599990.0,600200.0,600380.0,600572.0,600887.0,601032.0,601184.0,601386.0,601621.0,601821.0,602022.0,602232.0,602441.0,602674.0,602869.0,603063.0,603299.0,603541.0,603781.0,604045.0,604299.0,604629.0,604857.0,605058.0,605323.0,605397.0,605281.0,605035.0,604612.0,604008.0,603369.0,602641.0,601878.0,601162.0,600486.0,599863.0,599407.0,599013.0,598607.0,598341.0,598138.0,597920.0,597821.0,597759.0,597693.0,597626.0,597642.0,597717.0,597774.0,597904.0,597929.0,598024.0,598142.0,598099.0,598166.0,598200.0,598185.0,598152.0,598182.0,598155.0,598151.0,598236.0,598246.0,598321.0,598409.0,598533.0,598622.0,598771.0,598892.0,599105.0,599287.0,599534.0,599641.0,599971.0,600166.0,600379.0,600567.0,600815.0,601052.0,601361.0,601544.0,601763.0,601971.0,602224.0,602438.0,602668.0,602895.0,603060.0,603305.0,603577.0,603808.0,604093.0,604283.0,604551.0,604818.0,604975.0,605198.0,605463.0,605737.0,605952.0,606177.0,606442.0,606684.0,606977.0,607260.0,607448.0,607791.0,608046.0,608339.0,608570.0,608742.0,608793.0,608753.0,608418.0,607926.0,607398.0,606720.0,607060.0,606535.0,605860.0,605140.0,602085.0,599373.0,602699.0,602427.0,602213.0,602035.0,601949.0,601883.0,601813.0,601795.0,601900.0,601916.0,602027.0,602153.0,602223.0,602320.0,602428.0,602500.0,602510.0,602522.0,602530.0,602541.0,602578.0,602449.0,602504.0,602575.0,602606.0,602674.0,602705.0,602766.0,602887.0,602965.0,603189.0,603287.0,603462.0,603716.0,603944.0,604112.0,604321.0,604510.0,604724.0,604946.0,605164.0,605407.0,605534.0,605828.0,606056.0,606178.0,606420.0,606552.0,606808.0,606943.0,607118.0,607333.0,607537.0,607669.0,607847.0,608002.0,608249.0,608488.0,608706.0,608910.0,609191.0,609332.0,609620.0,609946.0,610135.0,610367.0,610648.0,610890.0,611051.0,611134.0,611061.0,610875.0,610480.0,609868.0,609363.0,608707.0,608121.0,607534.0,606983.0,606540.0,606148.0,605862.0,605617.0,605489.0,605372.0,605409.0,605723.0,605899.0,606130.0,606202.0,604886.0,604932.0,605942.0,605779.0,606585.0,606407.0,606502.0,607668.0,606434.0,606464.0,607729.0,606478.0,606494.0,606559.0,606581.0,606545.0,606610.0,606706.0,606824.0,606992.0,607180.0,607373.0,607605.0,607830.0,608078.0,608315.0,608545.0,608885.0,609050.0,609308.0,609574.0,609753.0,610077.0,610293.0,610515.0,610799.0,611032.0,611244.0,611508.0,611762.0,612003.0,612239.0,612476.0,612725.0,612973.0,613186.0,613385.0,613640.0,613879.0,614147.0,614406.0,614602.0,614850.0,615103.0,615376.0,615614.0,615873.0,616150.0,616430.0,616630.0,616822.0,616803.0,616707.0,616427.0,616014.0,615451.0,614807.0,614105.0,613412.0,612781.0,612137.0,611650.0,611245.0,610848.0,610517.0,610285.0,610061.0,609918.0,609743.0,609612.0,609562.0,609491.0,609458.0,609542.0,609578.0,609651.0,609668.0,609726.0,609739.0,609720.0,609765.0,609813.0,609774.0,609725.0,609694.0,610003.0,610023.0,610034.0,610057.0,608425.0,609130.0,609581.0,609512.0,610112.0,610273.0,610399.0,610622.0,610661.0,610850.0,611057.0,611200.0,611452.0,610338.0,611726.0,611929.0,612087.0,612261.0,612487.0,612629.0,612838.0,613015.0,613238.0,613389.0,613607.0,613736.0,613980.0,614180.0,614263.0,614500.0,614736.0,614891.0,615177.0,615338.0,615509.0,615704.0,615942.0,616130.0,616384.0,616579.0,616864.0,617097.0,617291.0,617510.0,617807.0,617967.0,618053.0,618027.0,617807.0,617503.0,616934.0,616372.0,615659.0,614931.0,614182.0,613512.0,612887.0,612320.0,611846.0,611554.0,611244.0,610966.0,610697.0,610461.0,610357.0,610191.0,610103.0,610020.0,610007.0,610036.0,610034.0,610069.0,610114.0,610059.0,610036.0,610082.0,610037.0,609999.0,609936.0,609858.0,609830.0,609809.0,609763.0,609757.0,609737.0,609739.0,609796.0,609868.0,610008.0,610131.0,610168.0,610367.0,610549.0,610626.0,610869.0,611033.0,611172.0,611404.0,611583.0,611751.0,611924.0,612096.0,612244.0,612425.0,612614.0,612823.0,612918.0,613358.0,613455.0,612258.0,613630.0,613497.0,615232.0,613894.0,615699.0,614473.0,614658.0,614857.0,615035.0,615220.0,615465.0,615647.0,615851.0,616039.0,616363.0,616516.0,616790.0,617021.0,617211.0,617414.0,617395.0,617433.0,617135.0,616764.0,616171.0,615508.0,614869.0,614078.0,613363.0,612747.0,612073.0,611545.0,611076.0,610728.0,610407.0,610162.0,610048.0,609919.0,609791.0,609704.0,609682.0,609676.0,609674.0,609731.0,609796.0,609848.0,609890.0,609992.0,609935.0,609933.0,609943.0,609921.0,609858.0,609783.0,609742.0,609725.0,609631.0,609680.0,609710.0,609802.0,609759.0,609871.0,610035.0,610062.0,610213.0,610349.0,610509.0,610680.0,610862.0,610993.0,611196.0,611347.0,611573.0,611681.0,611877.0,612099.0,612302.0,612481.0,612662.0,612784.0,613009.0,613171.0,613366.0,613556.0,613948.0,613879.0,614051.0,614195.0,614165.0,614916.0,614986.0,615159.0,616104.0,615342.0,615481.0,615742.0,615945.0,616150.0,616320.0,616609.0,616718.0,616877.0,616794.0,616533.0,616157.0,615581.0,615141.0,614437.0,613727.0,613125.0,612532.0,611943.0,611451.0,611086.0,610744.0,610504.0,610294.0,610151.0,610102.0,610024.0,610032.0,610026.0,610145.0,610180.0,610242.0,610315.0,610474.0,610494.0,610576.0,610593.0,610571.0,610581.0,610530.0,610501.0,610400.0,610392.0,610398.0,610418.0,610385.0,610467.0,610491.0,610644.0,610687.0,610812.0,610926.0,611124.0,611349.0,611463.0,611652.0,611936.0,612118.0,612335.0,612521.0,612738.0,612944.0,613114.0,613327.0,613526.0,613730.0,613917.0,614094.0,614332.0,614475.0,614761.0,614883.0,615119.0,615339.0,615538.0,615767.0,616015.0,616142.0,616426.0,616672.0,616855.0,617095.0,617343.0,617599.0,617768.0,617936.0,617950.0,617902.0,617618.0,617195.0,616670.0,615868.0,614519.0,614616.0,614589.0,614775.0,613061.0,613868.0,611791.0,611001.0,610922.0,610428.0,610448.0,611318.0,611263.0,611254.0,611241.0,611363.0,611393.0,611454.0,611566.0,611590.0,611740.0,611751.0,611836.0,611875.0,611845.0,611847.0,611857.0,611850.0,611900.0,611850.0,611896.0,611906.0,612016.0,612076.0,612168.0,612289.0,612422.0,612547.0,612724.0,612883.0,613123.0,613322.0,613528.0,613754.0,613935.0,614120.0,614366.0,614580.0,614716.0,614934.0,615145.0,615352.0,615534.0,615851.0,616006.0,616158.0,616332.0,616509.0,616730.0,616938.0,617159.0,617380.0,617557.0,617741.0,617972.0,618204.0,618428.0,618677.0,618923.0,619105.0,619279.0,619446.0,619481.0,619381.0,619171.0,618772.0,618278.0,617769.0,617133.0,616533.0,615952.0,615393.0,614994.0,614552.0,614239.0,613971.0,613731.0,613534.0,613388.0,613273.0,613206.0,613119.0,613114.0,613185.0,613319.0,613340.0,613435.0,614405.0,613514.0,613653.0,614751.0,614764.0,612225.0,613292.0,612135.0,612138.0,613456.0,613461.0,613502.0,613583.0,613606.0,613720.0,613775.0,613928.0,614081.0,614233.0,614339.0,614518.0,614645.0,614852.0,614996.0,615242.0,615422.0,615598.0,615771.0,615938.0,616120.0,616269.0,616463.0,616648.0,616875.0,617003.0,617231.0,617443.0,617600.0,617911.0,617974.0,618193.0,618328.0,618568.0,618718.0,618910.0,619118.0,619297.0,619495.0,619712.0,619906.0,620135.0,620362.0,620576.0,620748.0,620844.0,620836.0,620618.0,620258.0,619806.0,619227.0,618625.0,618025.0,617377.0,616804.0,616230.0,615816.0,615382.0,615065.0,614847.0,614597.0,614415.0,614230.0,614143.0,613938.0,613932.0,613925.0,613953.0,613996.0,614060.0,614086.0,614156.0,614139.0,614181.0,614153.0,614116.0,614104.0,614064.0,613986.0,613955.0,613960.0,613962.0,613957.0,613957.0,613971.0,614080.0,614096.0,614894.0,613821.0,615138.0,615178.0,614747.0,614882.0,615193.0,615187.0,615182.0,615086.0,616718.0,614315.0,615813.0,616052.0,616198.0,616388.0,616487.0,616649.0,616817.0,616967.0,617124.0,617258.0,617472.0,617597.0,617755.0,617940.0,618163.0,618224.0,618409.0,618613.0,618745.0,618935.0,619149.0,619317.0,619536.0,619714.0,619887.0,620128.0,620292.0,620463.0,620421.0,620337.0,620070.0,619605.0,619082.0,618484.0,617809.0,617158.0,616500.0,615919.0,615377.0,614935.0,614538.0,614198.0,613944.0,613721.0,613576.0,613436.0,613359.0,613314.0,613260.0,613279.0,613354.0,613341.0,613359.0,613442.0,613447.0,613429.0,613366.0,613269.0,613261.0,613146.0,613065.0,612943.0,612878.0,612793.0,612733.0,612797.0,612740.0,612775.0,612822.0,612849.0,612926.0,613058.0,613189.0,613310.0,613401.0,613566.0,613664.0,613789.0,613978.0,614168.0,614318.0,614517.0,614669.0,614813.0,614982.0,615129.0,615282.0,615400.0,615578.0,615738.0,615832.0,615957.0,616121.0,616264.0,616392.0,616573.0,616737.0,616910.0,617114.0,617015.0,617960.0,617788.0,617865.0,619325.0,619454.0,619548.0,619210.0,617990.0,617718.0,617199.0,616631.0,615975.0,615253.0,614546.0,613924.0,613334.0,612810.0,612367.0,611930.0,611631.0,611456.0,611136.0,610977.0,610822.0,610726.0,610633.0,610622.0,610641.0,610662.0,610722.0,610732.0,610751.0,610769.0,610733.0,610749.0,610622.0,610594.0,610550.0,610473.0,610342.0,610311.0,610319.0,610287.0,610256.0,610317.0,610306.0,610367.0,610435.0,610562.0,610668.0,610781.0,610924.0,611063.0,611274.0,611348.0,611445.0,611645.0,611804.0,611971.0,612123.0,612321.0,612443.0,612554.0,612801.0,612929.0,613117.0,613337.0,613424.0,613654.0,613753.0,613916.0,614043.0,614233.0,614383.0,614536.0,614709.0,614875.0,615086.0,615277.0,615475.0,615694.0,615886.0,616094.0,616312.0,616496.0,616755.0,616882.0,616947.0,616937.0,616711.0,616284.0,615796.0,615068.0,614349.0,613629.0,612851.0,612120.0,611468.0,611142.0,610730.0,610322.0,609696.0,607905.0,609129.0,608926.0,608746.0,608436.0,608275.0,608181.0,608163.0,608103.0,608107.0,608095.0,608073.0,608113.0,608014.0,607999.0,607923.0,607867.0,607751.0,607702.0,607595.0,607476.0,607471.0,607487.0,607450.0,607378.0,607419.0,607474.0,607581.0,607593.0,607706.0,607856.0,607946.0,608064.0,608149.0,608380.0,608510.0,608689.0,608854.0,608998.0,609165.0,609332.0,609514.0,609676.0,609808.0,609939.0,610108.0,610298.0,610421.0,610642.0,610756.0,610948.0,611075.0,611272.0,611440.0,611666.0,611809.0,611966.0,612207.0,612369.0,612547.0,612712.0,612881.0,613100.0,613324.0,613539.0,613754.0,614050.0,614215.0,614396.0,614583.0,614652.0,614553.0,614264.0,613805.0,613265.0,612568.0,611763.0,611016.0,610340.0,609611.0,608990.0,608748.0,608183.0,607789.0,607650.0,607706.0,607440.0,607525.0,605095.0,604931.0,606646.0,604747.0,605952.0,605936.0,605920.0,605926.0,605960.0,605933.0,605992.0,605874.0,605857.0,605804.0,605781.0,605675.0,605660.0,605539.0,605529.0,605567.0,605536.0,605575.0,605630.0,605669.0,605806.0,605894.0,605970.0,606083.0,606267.0,606491.0,606611.0,605982.0,604776.0,607091.0,607247.0,607405.0,607604.0,607764.0,607927.0,608175.0,608311.0,608475.0,608682.0,608837.0,609007.0,609145.0,609385.0,609546.0,609751.0,609837.0,610094.0,610281.0,610423.0,610647.0,610850.0,610916.0,611134.0,611367.0,611490.0,611661.0,611882.0,612075.0,612277.0,612481.0,612776.0,612929.0,613166.0,613323.0,613476.0,613586.0,613431.0,613126.0,612691.0,612019.0,611402.0,610693.0,609919.0,609199.0,608450.0,607884.0,607380.0,606869.0,606595.0,606312.0,606037.0\n","output_type":"stream"}]},{"cell_type":"code","source":"gsr_third_value = data_intervals_dataframe['gsr_data'].iloc[2]\nprint(gsr_third_value)\nprint(type(gsr_third_value))","metadata":{"execution":{"iopub.status.busy":"2024-11-15T03:34:25.546413Z","iopub.execute_input":"2024-11-15T03:34:25.547245Z","iopub.status.idle":"2024-11-15T03:34:25.964478Z","shell.execute_reply.started":"2024-11-15T03:34:25.547186Z","shell.execute_reply":"2024-11-15T03:34:25.962832Z"},"trusted":true},"execution_count":1,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)","Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m gsr_third_value \u001b[38;5;241m=\u001b[39m \u001b[43mdata_intervals_dataframe\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgsr_data\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39miloc[\u001b[38;5;241m2\u001b[39m]\n\u001b[1;32m      2\u001b[0m \u001b[38;5;28mprint\u001b[39m(gsr_third_value)\n\u001b[1;32m      3\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;28mtype\u001b[39m(gsr_third_value))\n","\u001b[0;31mNameError\u001b[0m: name 'data_intervals_dataframe' is not defined"],"ename":"NameError","evalue":"name 'data_intervals_dataframe' is not defined","output_type":"error"}]},{"cell_type":"markdown","source":"# TODO EDIT HERE 15 NOV 1223 AM","metadata":{}},{"cell_type":"code","source":"# import numpy as np\n# import pandas as pd\n# # from scipy.signal import morlet\n# from scipy.stats import kurtosis\n# import pywt\n\n# # Function to convert the string in 'gsr_data' to a list of floats\n# def convert_gsr_data_string_to_list(gsr_data_str):\n#     \"\"\"\n#     Convert a string of comma-separated numbers into a list of floats.\n#     \"\"\"\n#     return list(map(float, gsr_data_str.split(',')))\n\n# # Example function to extract CWT coefficients and frequencies from GSR data\n# def extract_cwt_features(gsr_data, sampling_rate=4, wavelet='morlet'):\n#     \"\"\"\n#     Perform Continuous Wavelet Transform on GSR data and return coefficients and frequencies.\n    \n#     Parameters:\n#     - gsr_data: List or array of GSR signal values\n#     - sampling_rate: The sampling frequency of the GSR data (default is 100Hz)\n#     - wavelet: Type of wavelet to use (default is 'morlet')\n    \n#     Returns:\n#     - cwt_coefficients: The coefficients resulting from the CWT\n#     - frequencies: The corresponding frequencies used for the CWT\n#     \"\"\"\n#     # Ensure gsr_data is a numpy array\n#     gsr_signal = np.array(gsr_data)\n#     scales = np.arange(1,271 )\n    \n#     # Generate a time array for the signal (assuming uniform sampling)\n# #     time_points = np.arange(len(gsr_signal)) / sampling_rate\n\n    \n#     # Perform CWT using the specified wavelet (e.g., Morlet)\n#     cwt_coefficients, cwt_frequencies = pywt.cwt(gsr_signal , scales, 'morl')\n    \n    \n#     return cwt_coefficients\n\n# # Function to extract features from CWT coefficients\n# def extract_cwt_features_from_coefficients(cwt_coefficients):\n#     \"\"\"\n#     Extract time-domain features from CWT coefficients.\n    \n#     Parameters:\n#     - cwt_coefficients: 2D array (scales x time points)\n    \n#     Returns:\n#     - A dictionary containing mean, variance, max, and kurtosis of the coefficients across time\n#     \"\"\"\n#     # Take the magnitude of the complex CWT coefficients (optional)\n# #     cwt_coefficients_mag = np.abs(cwt_coefficients)\n    \n#     # Extract features across scales\n#     mean_coefficients = np.mean(cwt_coefficients, axis=1)  # Mean across time for each scale\n#     variance_coefficients = np.var(cwt_coefficients, axis=1)  # Variance across time for each scale\n#     max_coefficients = np.max(cwt_coefficients, axis=1)  # Max value across time for each scale\n#     kurtosis_coefficients = kurtosis(cwt_coefficients, axis=1)  # Kurtosis across time for each scale\n    \n#     return {\n#         'mean_coefficients': mean_coefficients,\n#         'variance_coefficients': variance_coefficients,\n#         'max_coefficients': max_coefficients,\n#         'kurtosis_coefficients': kurtosis_coefficients\n#     }\n\n\n# # TODO EDIT HERE\n# # Apply CWT to the GSR data and extract features\n# def extract_features_for_all_rows(df):\n#     features = []\n    \n#     for _, row in df.iterrows():\n#         gsr_data_str = row['gsr_data']\n        \n#         # Convert the GSR data string into a list of numbers\n#         gsr_data = convert_gsr_data_string_to_list(gsr_data_str)\n        \n#         # Extract CWT coefficients for the GSR data\n#         cwt_coefficients = extract_cwt_features(gsr_data)\n        \n#         # Extract features from the CWT coefficients\n#         cwt_features = extract_cwt_features_from_coefficients(cwt_coefficients)\n        \n#         # Append features along with subject_id, video_id, and arousal_valence_label\n#         feature_dict = {\n#             'subject_id': row['subject_id'],\n#             'video_id': row['video_id'],\n#             'arousal_valence_label': row['arousal_valence_label'],\n#             'mean_coefficients': cwt_features['mean_coefficients'],\n#             'variance_coefficients': cwt_features['variance_coefficients'],\n#             'max_coefficients': cwt_features['max_coefficients'],\n#             'kurtosis_coefficients': cwt_features['kurtosis_coefficients']\n#         }\n#         features.append(feature_dict)\n    \n#     # Convert the list of features to a DataFrame\n#     gsr_features = pd.DataFrame(features)\n#     return gsr_features\n\n\n\n# # Extract features from all rows in the dataframe\n# gsr_features = extract_features_for_all_rows(data_intervals_dataframe)\n\n# # Verify the result\n# print(gsr_features.head())\n\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T16:18:46.582743Z","iopub.execute_input":"2024-11-14T16:18:46.583724Z","iopub.status.idle":"2024-11-14T16:19:59.583427Z","shell.execute_reply.started":"2024-11-14T16:18:46.583680Z","shell.execute_reply":"2024-11-14T16:19:59.582430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Extract CWT Features from GSR DATA - 15 NOV 1134 AM","metadata":{}},{"cell_type":"code","source":"# import numpy as np\n# import pandas as pd\n# import pywt  # Make sure to have PyWavelets installed: pip install PyWavelets\n\n# # Function to convert the string in 'gsr_data' to a list of floats\n# def convert_gsr_data_string_to_list(gsr_data_str):\n#     \"\"\"\n#     Convert a string of comma-separated numbers into a list of floats.\n#     \"\"\"\n#     return list(map(float, gsr_data_str.split(',')))\n\n# # Function to extract wavelet coefficients and flatten them\n# def extract_wavelet_features(signal, scales, wavelet='morl'):\n#     \"\"\"\n#     Extract wavelet coefficients from the signal using the specified scales and wavelet.\n    \n#     Parameters:\n#     - signal: List or array of numerical values representing the signal data\n#     - scales: Scales to be used in the wavelet transform\n#     - wavelet: Type of wavelet to use (default is 'morl')\n    \n#     Returns:\n#     - Flattened wavelet coefficients\n#     \"\"\"\n#     coefficients, _ = pywt.cwt(signal, scales, wavelet)\n#     flat_coefficients = coefficients.flatten()\n#     return flat_coefficients\n\n# # Set the scales for wavelet transform\n# scales = np.arange(1, 271)\n\n# # Prepare the feature matrix and labels\n# gsr_features = []\n# labels = []\n\n# # Iterate over each row in the dataframe to extract features and labels\n# for _, row in data_intervals_dataframe.iterrows():\n#     # Step 1: Get the GSR data and convert to list of floats\n#     gsr_data_str = row['gsr_data']\n#     gsr_data = convert_gsr_data_string_to_list(gsr_data_str)\n    \n#     # Step 2: Extract wavelet coefficients\n#     wavelet_features = extract_wavelet_features(gsr_data, scales)\n    \n#     # Append the features and label\n#     gsr_features.append(wavelet_features)\n#     labels.append(row['arousal_valence_label'])  # Assuming 'arousal_valence_label' is the target label\n\n# # # Step 3: Convert the features and labels into NumPy arrays\n# # gsr_features = np.array(gsr_features)\n# # labels = np.array(labels)\n\n# # # Step 4: Convert the features and labels into a DataFrame\n# # gsr_dataframe_features = pd.DataFrame(gsr_features)\n# # gsr_dataframe_features['label'] = labels\n\n# # # Verify the result\n# # print(gsr_dataframe_features.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T03:35:01.284897Z","iopub.execute_input":"2024-11-15T03:35:01.285317Z","iopub.status.idle":"2024-11-15T03:36:38.033278Z","shell.execute_reply.started":"2024-11-15T03:35:01.285278Z","shell.execute_reply":"2024-11-15T03:36:38.031733Z"},"trusted":true},"execution_count":3,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)","Cell \u001b[0;32mIn[3], line 50\u001b[0m\n\u001b[1;32m     47\u001b[0m     labels\u001b[38;5;241m.\u001b[39mappend(row[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124marousal_valence_label\u001b[39m\u001b[38;5;124m'\u001b[39m])  \u001b[38;5;66;03m# Assuming 'arousal_valence_label' is the target label\u001b[39;00m\n\u001b[1;32m     49\u001b[0m \u001b[38;5;66;03m# Step 3: Convert the features and labels into NumPy arrays\u001b[39;00m\n\u001b[0;32m---> 50\u001b[0m gsr_features \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgsr_features\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     51\u001b[0m labels \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marray(labels)\n\u001b[1;32m     53\u001b[0m \u001b[38;5;66;03m# Step 4: Convert the features and labels into a DataFrame\u001b[39;00m\n","\u001b[0;31mValueError\u001b[0m: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2336,) + inhomogeneous part."],"ename":"ValueError","evalue":"setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2336,) + inhomogeneous part.","output_type":"error"}]},{"cell_type":"code","source":"# Function to extract summary features (mean, variance, max) from wavelet coefficients\ndef extract_summary_wavelet_features(signal, scales, wavelet='morl'):\n    coefficients, _ = pywt.cwt(signal, scales, wavelet)\n    mean_coefficients = np.mean(coefficients, axis=1)\n    variance_coefficients = np.var(coefficients, axis=1)\n    max_coefficients = np.max(coefficients, axis=1)\n    return np.concatenate([mean_coefficients, variance_coefficients, max_coefficients])\n\n# Prepare the feature matrix and labels\ngsr_features = []\nlabels = []\n\nfor _, row in data_intervals_dataframe.iterrows():\n    gsr_data_str = row['gsr_data']\n    gsr_data = convert_gsr_data_string_to_list(gsr_data_str)\n    wavelet_features = extract_summary_wavelet_features(gsr_data, scales)\n    gsr_features.append(wavelet_features)\n    labels.append(row['arousal_valence_label'])\n\n# Convert the features and labels into a DataFrame\ngsr_dataframe_features = pd.DataFrame(gsr_features)\ngsr_dataframe_features['label'] = labels\n\nprint(gsr_dataframe_features.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T03:39:17.484997Z","iopub.execute_input":"2024-11-15T03:39:17.486189Z","iopub.status.idle":"2024-11-15T03:40:54.172047Z","shell.execute_reply.started":"2024-11-15T03:39:17.486130Z","shell.execute_reply":"2024-11-15T03:40:54.170951Z"},"trusted":true},"execution_count":4,"outputs":[{"name":"stdout","text":"            0           1           2            3            4            5  \\\n0 -489.900064  249.957626  695.798650  1269.989317  1932.865525  2512.369072   \n1 -371.298968  188.241130  525.770448   962.464232  1467.857592  1908.403496   \n2 -332.607841  169.239480  471.893956   864.626077  1319.076539  1715.661136   \n3 -372.088379  189.657275  527.273115   971.353328  1484.931226  1910.980927   \n4 -382.798504  194.297101  541.833674   994.344921  1519.422305  1980.394334   \n\n             6            7            8            9  ...           801  \\\n0  3035.143103  3931.854024  4497.474746  5534.682888  ...  9.222004e+05   \n1  2307.558460  2997.022780  3450.632849  4261.863915  ...  1.145031e+06   \n2  2070.769858  2677.494942  3060.500768  3755.133436  ...  1.059251e+06   \n3  2296.053767  3004.335749  3473.895496  4280.011442  ...  1.243630e+06   \n4  2393.632877  3090.700393  3528.040062  4328.128452  ...  1.185605e+06   \n\n            802           803           804           805           806  \\\n0  9.237927e+05  9.255680e+05  9.274040e+05  9.292090e+05  9.309539e+05   \n1  1.147379e+06  1.144002e+06  1.140174e+06  1.140890e+06  1.143464e+06   \n2  1.060781e+06  1.062591e+06  1.054079e+06  1.052712e+06  1.054688e+06   \n3  1.245969e+06  1.248440e+06  1.235894e+06  1.236140e+06  1.237884e+06   \n4  1.187782e+06  1.189970e+06  1.179381e+06  1.178421e+06  1.180561e+06   \n\n            807           808           809  label  \n0  9.268573e+05  9.285849e+05  9.076872e+05   AMVM  \n1  1.146107e+06  1.146324e+06  1.148582e+06   AMVL  \n2  1.056171e+06  1.058073e+06  1.059665e+06   AMVM  \n3  1.240125e+06  1.242307e+06  1.244429e+06   AMVM  \n4  1.182695e+06  1.184650e+06  1.186798e+06   AMVM  \n\n[5 rows x 811 columns]\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Checking GSR Dataframe Features","metadata":{}},{"cell_type":"code","source":"gsr_dataframe_features.shape","metadata":{"execution":{"iopub.status.busy":"2024-11-15T03:41:32.405218Z","iopub.execute_input":"2024-11-15T03:41:32.405999Z","iopub.status.idle":"2024-11-15T03:41:32.414101Z","shell.execute_reply.started":"2024-11-15T03:41:32.405955Z","shell.execute_reply":"2024-11-15T03:41:32.412965Z"},"trusted":true},"execution_count":5,"outputs":[{"execution_count":5,"output_type":"execute_result","data":{"text/plain":"(2336, 811)"},"metadata":{}}]},{"cell_type":"code","source":"# Save the DataFrame to a CSV file\ngsr_dataframe_features.to_csv('gsr_cwt_features.csv', index=False)\n\nprint(\"Data saved to gsr_cwt_features.csv\")\n\n# Specify the path to the CSV file\nfile_path = '/kaggle/working/gsr_cwt_features.csv'\n\n# Read the CSV file into a DataFrame\ngsr_cwt_features = pd.read_csv(file_path)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T03:44:41.652124Z","iopub.execute_input":"2024-11-15T03:44:41.653131Z","iopub.status.idle":"2024-11-15T03:44:46.525772Z","shell.execute_reply.started":"2024-11-15T03:44:41.653084Z","shell.execute_reply":"2024-11-15T03:44:46.524844Z"},"trusted":true},"execution_count":6,"outputs":[{"name":"stdout","text":"Data saved to gsr_cwt_features.csv\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Load the GSR CWT FEATURES EXTRACTED CSV File ","metadata":{}},{"cell_type":"code","source":"# Specify the path to the CSV file\nfile_path = '/kaggle/input/gsr-cwt-features-extracted/gsr_cwt_features.csv'\n\n# Read the CSV file into a DataFrame\ngsr_dataframe_features_extracted = pd.read_csv(file_path)\n\nprint(gsr_dataframe_features_extracted.shape)\nprint(\"====================================\\n\")\nprint(gsr_dataframe_features_extracted.head())","metadata":{"execution":{"iopub.status.busy":"2024-11-15T03:54:36.620645Z","iopub.execute_input":"2024-11-15T03:54:36.621879Z","iopub.status.idle":"2024-11-15T03:54:37.211277Z","shell.execute_reply.started":"2024-11-15T03:54:36.621818Z","shell.execute_reply":"2024-11-15T03:54:37.210191Z"},"trusted":true},"execution_count":9,"outputs":[{"name":"stdout","text":"(2336, 811)\n====================================\n\n            0           1           2            3            4            5  \\\n0 -489.900064  249.957626  695.798650  1269.989317  1932.865525  2512.369072   \n1 -371.298968  188.241130  525.770448   962.464232  1467.857592  1908.403496   \n2 -332.607841  169.239480  471.893956   864.626077  1319.076539  1715.661136   \n3 -372.088379  189.657275  527.273115   971.353328  1484.931226  1910.980927   \n4 -382.798504  194.297101  541.833674   994.344921  1519.422305  1980.394334   \n\n             6            7            8            9  ...           801  \\\n0  3035.143103  3931.854024  4497.474746  5534.682888  ...  9.222004e+05   \n1  2307.558460  2997.022780  3450.632849  4261.863915  ...  1.145031e+06   \n2  2070.769858  2677.494942  3060.500768  3755.133436  ...  1.059251e+06   \n3  2296.053767  3004.335749  3473.895496  4280.011442  ...  1.243630e+06   \n4  2393.632877  3090.700393  3528.040062  4328.128452  ...  1.185605e+06   \n\n            802           803           804           805           806  \\\n0  9.237927e+05  9.255680e+05  9.274040e+05  9.292090e+05  9.309539e+05   \n1  1.147379e+06  1.144002e+06  1.140174e+06  1.140890e+06  1.143464e+06   \n2  1.060781e+06  1.062591e+06  1.054079e+06  1.052712e+06  1.054688e+06   \n3  1.245969e+06  1.248440e+06  1.235894e+06  1.236140e+06  1.237884e+06   \n4  1.187782e+06  1.189970e+06  1.179381e+06  1.178421e+06  1.180561e+06   \n\n            807           808           809  label  \n0  9.268573e+05  9.285849e+05  9.076872e+05   AMVM  \n1  1.146107e+06  1.146324e+06  1.148582e+06   AMVL  \n2  1.056171e+06  1.058073e+06  1.059665e+06   AMVM  \n3  1.240125e+06  1.242307e+06  1.244429e+06   AMVM  \n4  1.182695e+06  1.184650e+06  1.186798e+06   AMVM  \n\n[5 rows x 811 columns]\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Concatenate the PPG and GSR Features Extracted as a dataframe","metadata":{}},{"cell_type":"code","source":"ppg_all_features = pd.read_csv('/kaggle/input/ppg-extracted-features/ppg_all_features.csv')\n# gsr_dataframe_features_extracted\nprint(ppg_all_features.head())\nprint(ppg_all_features.columns)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T03:57:14.939294Z","iopub.execute_input":"2024-11-15T03:57:14.939732Z","iopub.status.idle":"2024-11-15T03:57:14.991558Z","shell.execute_reply.started":"2024-11-15T03:57:14.939690Z","shell.execute_reply":"2024-11-15T03:57:14.990501Z"},"trusted":true},"execution_count":11,"outputs":[{"name":"stdout","text":"            mean           var         median            max            min  \\\n0  523505.254326  7.475432e+08  511816.485714  612290.528571  503611.914286   \n1  545864.656894  3.998819e+08  545232.657143  608431.714286  508410.371429   \n2  610096.347869  2.331632e+07  610328.371429  621036.285714  596463.114286   \n3  561703.954208  9.843148e+08  547563.742857  641537.542857  519073.514286   \n4  529994.326120  8.406916e+07  528735.542857  551489.257143  512744.657143   \n\n           range       rmssd        sdsd  nni_50    pnni_50  ...  \\\n0  108678.614286  228.366212  224.163580  1597.0  72.557928  ...   \n1  100021.342857  366.326098  366.382285  2609.0  84.134150  ...   \n2   24573.171429  297.220224  297.268152  2628.0  84.746856  ...   \n3  122464.028571  414.100720  413.899262  2643.0  85.230571  ...   \n4   38744.600000  234.629280  234.543208  2354.0  78.440520  ...   \n\n            vlf            lf            hf       tot_pow  lf_hf_ratio  \\\n0  0.000000e+00  6.147186e+07  3.030959e+05  6.177495e+07   202.813259   \n1  1.656730e+07  1.274268e+08  3.504205e+07  1.790361e+08     3.636396   \n2  2.496412e+06  9.414860e+06  1.981257e+06  1.389253e+07     4.751964   \n3  1.208835e+08  1.102812e+08  2.583060e+07  2.569952e+08     4.269400   \n4  1.917388e+06  1.034756e+07  1.214425e+07  2.440920e+07     0.852055   \n\n   peak_vlf   peak_lf   peak_hf      lf_nu      hf_nu  \n0  0.000000  0.044944  0.224719  99.509355   0.490645  \n1  0.032000  0.128000  0.160000  78.431525  21.568475  \n2  0.032000  0.128000  0.160000  82.614633  17.385367  \n3  0.032000  0.096000  0.160000  81.022508  18.977492  \n4  0.033058  0.132231  0.165289  46.005921  53.994079  \n\n[5 rows x 31 columns]\nIndex(['mean', 'var', 'median', 'max', 'min', 'range', 'rmssd', 'sdsd',\n       'nni_50', 'pnni_50', 'nni_20', 'pnni_20', 'avg_hr', 'std_hr', 'min_hr',\n       'max_hr', 'energy', 'abs_sum_diff', 'subject_id', 'video_id',\n       'arousal_valence_label', 'vlf', 'lf', 'hf', 'tot_pow', 'lf_hf_ratio',\n       'peak_vlf', 'peak_lf', 'peak_hf', 'lf_nu', 'hf_nu'],\n      dtype='object')\n","output_type":"stream"}]},{"cell_type":"code","source":"print(gsr_dataframe_features_extracted.columns)\n\n# drop the label column in gsr_dataframe_features_extracted \n#  and concatenate gsr_dataframe_features_extracted dataframe and ppg_all_features dataframe","metadata":{"execution":{"iopub.status.busy":"2024-11-15T03:57:44.083124Z","iopub.execute_input":"2024-11-15T03:57:44.083556Z","iopub.status.idle":"2024-11-15T03:57:44.090430Z","shell.execute_reply.started":"2024-11-15T03:57:44.083516Z","shell.execute_reply":"2024-11-15T03:57:44.089130Z"},"trusted":true},"execution_count":12,"outputs":[{"name":"stdout","text":"Index(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n       ...\n       '801', '802', '803', '804', '805', '806', '807', '808', '809', 'label'],\n      dtype='object', length=811)\n","output_type":"stream"}]},{"cell_type":"code","source":"# Drop the 'label' column from gsr_dataframe_features_extracted and save as gsr_dataframe_features\ngsr_dataframe_features = gsr_dataframe_features_extracted.drop(columns=['label'])\n\n# Concatenate gsr_dataframe_features and ppg_all_features along columns (axis=1)\ncombined_features = pd.concat([gsr_dataframe_features, ppg_all_features], axis=1)\n\n# Display the first few rows to verify\nprint(combined_features.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T04:04:05.628048Z","iopub.execute_input":"2024-11-15T04:04:05.628484Z","iopub.status.idle":"2024-11-15T04:04:05.654870Z","shell.execute_reply.started":"2024-11-15T04:04:05.628444Z","shell.execute_reply":"2024-11-15T04:04:05.653685Z"},"trusted":true},"execution_count":14,"outputs":[{"name":"stdout","text":"            0           1           2            3            4            5  \\\n0 -489.900064  249.957626  695.798650  1269.989317  1932.865525  2512.369072   \n1 -371.298968  188.241130  525.770448   962.464232  1467.857592  1908.403496   \n2 -332.607841  169.239480  471.893956   864.626077  1319.076539  1715.661136   \n3 -372.088379  189.657275  527.273115   971.353328  1484.931226  1910.980927   \n4 -382.798504  194.297101  541.833674   994.344921  1519.422305  1980.394334   \n\n             6            7            8            9  ...           vlf  \\\n0  3035.143103  3931.854024  4497.474746  5534.682888  ...  0.000000e+00   \n1  2307.558460  2997.022780  3450.632849  4261.863915  ...  1.656730e+07   \n2  2070.769858  2677.494942  3060.500768  3755.133436  ...  2.496412e+06   \n3  2296.053767  3004.335749  3473.895496  4280.011442  ...  1.208835e+08   \n4  2393.632877  3090.700393  3528.040062  4328.128452  ...  1.917388e+06   \n\n             lf            hf       tot_pow  lf_hf_ratio  peak_vlf   peak_lf  \\\n0  6.147186e+07  3.030959e+05  6.177495e+07   202.813259  0.000000  0.044944   \n1  1.274268e+08  3.504205e+07  1.790361e+08     3.636396  0.032000  0.128000   \n2  9.414860e+06  1.981257e+06  1.389253e+07     4.751964  0.032000  0.128000   \n3  1.102812e+08  2.583060e+07  2.569952e+08     4.269400  0.032000  0.096000   \n4  1.034756e+07  1.214425e+07  2.440920e+07     0.852055  0.033058  0.132231   \n\n    peak_hf      lf_nu      hf_nu  \n0  0.224719  99.509355   0.490645  \n1  0.160000  78.431525  21.568475  \n2  0.160000  82.614633  17.385367  \n3  0.160000  81.022508  18.977492  \n4  0.165289  46.005921  53.994079  \n\n[5 rows x 841 columns]\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Check shape of combined_features\n\n# 31 columns + 811 columns = 842 columns\n# 2336 rows","metadata":{}},{"cell_type":"code","source":"\ncombined_features.shape\n\n\n\n# Save the DataFrame to a CSV file\ncombined_features.to_csv('combined_features_ppg_gsr.csv', index=False)\n\nprint(\"Data saved to combined_features_ppg_gsr.csv\")\n\n# Specify the path to the CSV file\nfile_path = '/kaggle/working/combined_features_ppg_gsr.csv'\n\n# Read the CSV file into a DataFrame\ncombined_features_ppg_gsr = pd.read_csv(file_path)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T04:08:06.066456Z","iopub.execute_input":"2024-11-15T04:08:06.066955Z","iopub.status.idle":"2024-11-15T04:08:11.127722Z","shell.execute_reply.started":"2024-11-15T04:08:06.066910Z","shell.execute_reply":"2024-11-15T04:08:11.126740Z"},"trusted":true},"execution_count":18,"outputs":[{"name":"stdout","text":"Data saved to combined_features_ppg_gsr.csv\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# LOAD CSV HERE FOR COMBINED FEATURES PPG GSR CONTAINS LABELS  SUBJECT ID VIDEO ID AND AROUSAL_VALENCE_LABEL","metadata":{}},{"cell_type":"code","source":"file_path = \n\ncombined_features_ppg_gsr.columns","metadata":{"execution":{"iopub.status.busy":"2024-11-15T04:10:14.150300Z","iopub.execute_input":"2024-11-15T04:10:14.151458Z","iopub.status.idle":"2024-11-15T04:10:14.159281Z","shell.execute_reply.started":"2024-11-15T04:10:14.151398Z","shell.execute_reply":"2024-11-15T04:10:14.158213Z"},"trusted":true},"execution_count":19,"outputs":[{"execution_count":19,"output_type":"execute_result","data":{"text/plain":"Index(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n       ...\n       'vlf', 'lf', 'hf', 'tot_pow', 'lf_hf_ratio', 'peak_vlf', 'peak_lf',\n       'peak_hf', 'lf_nu', 'hf_nu'],\n      dtype='object', length=841)"},"metadata":{}}]},{"cell_type":"code","source":"# create a dataframe called features_for_model by dropping the columns 'subject_id' and 'video_id'\n#  from combined_features_ppg_gsr\n\n# use the arousal_valence_label as label for labels for training a classification model \n\n# Drop 'subject_id' and 'video_id' from combined_features_ppg_gsr to create features_for_model\nfeatures_for_model = combined_features_ppg_gsr.drop(columns=['subject_id', 'video_id'])\n\n# Extract the labels from 'arousal_valence_label' column for classification\nlabels = features_for_model['arousal_valence_label']\n\n# Drop 'arousal_valence_label' column from features_for_model to retain only the features\nfeatures_for_model = features_for_model.drop(columns=['arousal_valence_label'])\n\n# Display the first few rows to verify\nprint(features_for_model.head())\nprint(labels.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T04:15:04.972759Z","iopub.execute_input":"2024-11-15T04:15:04.973876Z","iopub.status.idle":"2024-11-15T04:15:05.004004Z","shell.execute_reply.started":"2024-11-15T04:15:04.973816Z","shell.execute_reply":"2024-11-15T04:15:05.002956Z"},"trusted":true},"execution_count":20,"outputs":[{"name":"stdout","text":"            0           1           2            3            4            5  \\\n0 -489.900064  249.957626  695.798650  1269.989317  1932.865525  2512.369072   \n1 -371.298968  188.241130  525.770448   962.464232  1467.857592  1908.403496   \n2 -332.607841  169.239480  471.893956   864.626077  1319.076539  1715.661136   \n3 -372.088379  189.657275  527.273115   971.353328  1484.931226  1910.980927   \n4 -382.798504  194.297101  541.833674   994.344921  1519.422305  1980.394334   \n\n             6            7            8            9  ...           vlf  \\\n0  3035.143103  3931.854024  4497.474746  5534.682888  ...  0.000000e+00   \n1  2307.558460  2997.022780  3450.632849  4261.863915  ...  1.656730e+07   \n2  2070.769858  2677.494942  3060.500768  3755.133436  ...  2.496412e+06   \n3  2296.053767  3004.335749  3473.895496  4280.011442  ...  1.208835e+08   \n4  2393.632877  3090.700393  3528.040062  4328.128452  ...  1.917388e+06   \n\n             lf            hf       tot_pow  lf_hf_ratio  peak_vlf   peak_lf  \\\n0  6.147186e+07  3.030959e+05  6.177495e+07   202.813259  0.000000  0.044944   \n1  1.274268e+08  3.504205e+07  1.790361e+08     3.636396  0.032000  0.128000   \n2  9.414860e+06  1.981257e+06  1.389253e+07     4.751964  0.032000  0.128000   \n3  1.102812e+08  2.583060e+07  2.569952e+08     4.269400  0.032000  0.096000   \n4  1.034756e+07  1.214425e+07  2.440920e+07     0.852055  0.033058  0.132231   \n\n    peak_hf      lf_nu      hf_nu  \n0  0.224719  99.509355   0.490645  \n1  0.160000  78.431525  21.568475  \n2  0.160000  82.614633  17.385367  \n3  0.160000  81.022508  18.977492  \n4  0.165289  46.005921  53.994079  \n\n[5 rows x 838 columns]\n0    AMVM\n1    AMVL\n2    AMVM\n3    AMVM\n4    AMVM\nName: arousal_valence_label, dtype: object\n","output_type":"stream"}]},{"cell_type":"code","source":"features_for_model.columns","metadata":{"execution":{"iopub.status.busy":"2024-11-15T04:15:17.823162Z","iopub.execute_input":"2024-11-15T04:15:17.823615Z","iopub.status.idle":"2024-11-15T04:15:17.830978Z","shell.execute_reply.started":"2024-11-15T04:15:17.823571Z","shell.execute_reply":"2024-11-15T04:15:17.829860Z"},"trusted":true},"execution_count":21,"outputs":[{"execution_count":21,"output_type":"execute_result","data":{"text/plain":"Index(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n       ...\n       'vlf', 'lf', 'hf', 'tot_pow', 'lf_hf_ratio', 'peak_vlf', 'peak_lf',\n       'peak_hf', 'lf_nu', 'hf_nu'],\n      dtype='object', length=838)"},"metadata":{}}]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"features_for_model.to_csv('/kaggle/working/features_for_model.csv')\n\nprint(\"Data saved to features_for_model.csv\")\n\n# LOAD THE CSV ","metadata":{"execution":{"iopub.status.busy":"2024-11-15T04:18:41.449741Z","iopub.execute_input":"2024-11-15T04:18:41.450778Z","iopub.status.idle":"2024-11-15T04:18:45.893153Z","shell.execute_reply.started":"2024-11-15T04:18:41.450727Z","shell.execute_reply":"2024-11-15T04:18:45.891884Z"},"trusted":true},"execution_count":22,"outputs":[{"name":"stdout","text":"Data saved to features_for_model.csv\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# DO A TRAIN TEST SPLIT,OUTPUT CLASSES WILL BE TRY MULTIPLE TRADITIONAL ML ALGORITHMS WITH STRATIFIED X CROSS VALIDATION ","metadata":{}},{"cell_type":"markdown","source":"# 9 categories","metadata":{}},{"cell_type":"code","source":"# Step 1: Import Libraries\n# features_for_model AND labels\n# use the\n\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import StratifiedKFold, cross_val_score, train_test_split\nfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.svm import SVC\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.naive_bayes import GaussianNB\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Step 2: Define the Models and Perform Stratified Cross-Validation\n# Define the models\nmodels = {\n    'Random Forest': RandomForestClassifier(),\n    'Support Vector Classifier': SVC(),\n    'K-Nearest Neighbors': KNeighborsClassifier(),\n    'Logistic Regression': LogisticRegression(max_iter=1000),\n    'Naive Bayes': GaussianNB()\n}\n\n# Prepare cross-validation and store accuracies\nkfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)\nmodel_accuracies = {}\n\nfor name, model in models.items():\n    # Perform cross-validation\n    cv_accuracies = cross_val_score(model, features_for_model, labels, cv=kfold, scoring='accuracy')\n    model_accuracies[name] = cv_accuracies  # Store accuracy for each fold\n\n    # Print accuracy for each fold\n    print(f\"{name} - Cross-validation accuracies per fold: {cv_accuracies}\")\n    print(f\"{name} - Mean cross-validation accuracy: {np.mean(cv_accuracies):.4f}\\n\")\n\n    \n# Calculate mean and standard deviation of cross-validation accuracies\nmean_accuracies = {name: np.mean(acc) for name, acc in model_accuracies.items()}\nstd_accuracies = {name: np.std(acc) for name, acc in model_accuracies.items()}\n\n\n# Step 3: Plot the Mean Cross-Validation Accuracies\n# Plot the mean cross-validation accuracies with error bars for each model\nplt.figure(figsize=(10, 6))\nplt.bar(mean_accuracies.keys(), mean_accuracies.values(), yerr=std_accuracies.values(), capsize=5, color='skyblue')\nplt.xlabel('Machine Learning Algorithms')\nplt.ylabel('Mean Cross-Validation Accuracy')\nplt.title('Comparison of Mean Cross-Validation Accuracy Across Models')\nplt.ylim(0, 1)  # Set y-axis limit for better visibility\nplt.xticks(rotation=45)\nplt.show()\n\n# Step 4: Additional Performance Metrics \n\nfrom sklearn.metrics import precision_score, recall_score, f1_score\n\n# Train-test split for final evaluation\nX_train, X_test, y_train, y_test = train_test_split(features_for_model, labels, test_size=0.2, stratify=labels, random_state=42)\n\n# Initialize empty lists to store the metrics\nprecision_scores = []\nrecall_scores = []\nf1_scores = []\n\nfor name, model in models.items():\n    # Train and predict on the test split\n    model.fit(X_train, y_train)\n    y_pred = model.predict(X_test)\n    \n    # Calculate performance metrics\n    precision = precision_score(y_test, y_pred, average='weighted')\n    recall = recall_score(y_test, y_pred, average='weighted')\n    f1 = f1_score(y_test, y_pred, average='weighted')\n    \n    precision_scores.append(precision)\n    recall_scores.append(recall)\n    f1_scores.append(f1)\n\n# Plot metrics for each model\nmetrics_df = pd.DataFrame({\n    'Model': list(models.keys()),\n    'Precision': precision_scores,\n    'Recall': recall_scores,\n    'F1-Score': f1_scores\n}).set_index('Model')\n\nmetrics_df.plot(kind='bar', figsize=(10, 6))\nplt.title('Model Comparison - Precision, Recall, and F1 Score')\nplt.xlabel('Machine Learning Algorithms')\nplt.ylabel('Score')\nplt.ylim(0, 1)\nplt.xticks(rotation=45)\nplt.legend(loc=\"upper right\")\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T04:28:56.042407Z","iopub.execute_input":"2024-11-15T04:28:56.043004Z","iopub.status.idle":"2024-11-15T04:31:58.790382Z","shell.execute_reply.started":"2024-11-15T04:28:56.042946Z","shell.execute_reply":"2024-11-15T04:31:58.789210Z"},"trusted":true},"execution_count":23,"outputs":[{"name":"stdout","text":"Random Forest - Cross-validation accuracies per fold: [0.26068376 0.31196581 0.23931624 0.29059829 0.28205128 0.27777778\n 0.27467811 0.29613734 0.30042918 0.22746781]\nRandom Forest - Mean cross-validation accuracy: 0.2761\n\nSupport Vector Classifier - Cross-validation accuracies per fold: [0.28632479 0.28632479 0.28632479 0.28632479 0.28632479 0.28632479\n 0.28755365 0.2832618  0.2832618  0.2832618 ]\nSupport Vector Classifier - Mean cross-validation accuracy: 0.2855\n\nK-Nearest Neighbors - Cross-validation accuracies per fold: [0.17521368 0.17094017 0.15384615 0.1965812  0.18803419 0.19230769\n 0.18454936 0.18025751 0.19313305 0.14592275]\nK-Nearest Neighbors - Mean cross-validation accuracy: 0.1781\n\n","output_type":"stream"},{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/sklearn/linear_model/_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):\nSTOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n\nIncrease the number of iterations (max_iter) or scale the data as shown in:\n    https://scikit-learn.org/stable/modules/preprocessing.html\nPlease also refer to the documentation for alternative solver options:\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n  n_iter_i = _check_optimize_result(\n/opt/conda/lib/python3.10/site-packages/sklearn/linear_model/_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):\nSTOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n\nIncrease the number of iterations (max_iter) or scale the data as shown in:\n    https://scikit-learn.org/stable/modules/preprocessing.html\nPlease also refer to the documentation for alternative solver options:\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n  n_iter_i = _check_optimize_result(\n/opt/conda/lib/python3.10/site-packages/sklearn/linear_model/_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):\nSTOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n\nIncrease the number of iterations (max_iter) or scale the data as shown in:\n    https://scikit-learn.org/stable/modules/preprocessing.html\nPlease also refer to the documentation for alternative solver options:\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n  n_iter_i = _check_optimize_result(\n/opt/conda/lib/python3.10/site-packages/sklearn/linear_model/_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):\nSTOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n\nIncrease the number of iterations (max_iter) or scale the data as shown in:\n    https://scikit-learn.org/stable/modules/preprocessing.html\nPlease also refer to the documentation for alternative solver options:\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n  n_iter_i = _check_optimize_result(\n","output_type":"stream"},{"name":"stdout","text":"Logistic Regression - Cross-validation accuracies per fold: [0.27777778 0.27777778 0.26923077 0.28632479 0.29059829 0.28632479\n 0.28755365 0.28755365 0.28755365 0.28755365]\nLogistic Regression - Mean cross-validation accuracy: 0.2838\n\nNaive Bayes - Cross-validation accuracies per fold: [0.07264957 0.09401709 0.05128205 0.07264957 0.05555556 0.05982906\n 0.06437768 0.07296137 0.07296137 0.06437768]\nNaive Bayes - Mean cross-validation accuracy: 0.0681\n\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 1000x600 with 1 Axes>","image/png":"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Wh06dMi6vmH8SrwW1ViElClTau7cuapQoYI6d+4caQxKzZo1NWzYMK1atUqurq4KDQ3lbEECN3XqVM2ePVurVq3Sli1btH//fp0/f15dunTR6dOn9d577+nzzz/X48ePNW7cOGeXi1h28eJFNWzYUIUKFdLChQtVt25dTZw4UbVq1dL9+/dljNE777yjr776Shs3buQ4Ek101cNrK+LD5B9//KFt27bp5s2bqlKlit5//31duXJFZ86cUbly5azrdenSRVevXtWcOXPk4eHh7PIRz33wwQeqUKGCevTooUSJEmn06NF66623VKpUKd24cUMfffSRdu7cqQEDBqhfv36Snl53rG7duvL09NTixYsjjVdA/PNsF6vffvtNV65ckY+Pj3LmzKncuXMrKChI7733nq5fv65Vq1Ypb968kYJ0VGNbEL+tWrVKlStXVtKkSa1tXbp00fXr17VgwQJrt7sbN26oePHieueddzR79mxJ0q5du1SyZEn2mXiuTZs2Cg4OVqtWrVS7dm0NGzZMHTp0kCR9//33evDggb777jvr+nTVjCbnnewC/rulS5ea1KlTm5o1a5pWrVoZi8VievXqZR4/fmxd56+//jK9e/c23t7e5q+//nJitUgoevbsaTJmzGj9/cqVK6ZatWomVapU5s8//zTGGHPixAmTPn16U6VKFfPtt9+aqVOnmnfeeccUKFDA2mUiLCzMKfXj1evRo4dJly6dKViwoPH29jblypUz06ZNM8YY8+DBA1OuXDmTJ08ea7cbJFxDhgwxNWrUsOm+GxYWZurVq2fef/99a9ujR4+MMcbMnz/fZMyY0Vy4cMHmdji+xD8jR440gwcPNsYY4+/vb4oUKWISJ05sJk6caF3n/v37pmbNmuaLL75wVpmvNb5uwGvrxIkT6tatm4YMGaJVq1bpxx9/tA5qjJgl76+//tLIkSO1evVq/f777ypYsKAzS0YC8OTJE929e1dVq1aVJA0ePFjHjh3TsGHDVKVKFdWoUUO7d+/WG2+8IX9/f6VLl06LFi3SggULlCNHDu3fv9/aZYJvhBOG+fPna/bs2Vq+fLkOHDigLVu2KF++fJo4caLmzp2rpEmTas2aNbJYLNZLKSDh6t27t5YvXy6LxaIDBw7o3r17cnFx0SeffKItW7Zozpw5kmTtWWGMUdq0aeXl5WVzOxxf4pfH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"},"metadata":{}},{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n  _warn_prf(average, modifier, msg_start, len(result))\n/opt/conda/lib/python3.10/site-packages/sklearn/linear_model/_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):\nSTOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n\nIncrease the number of iterations (max_iter) or scale the data as shown in:\n    https://scikit-learn.org/stable/modules/preprocessing.html\nPlease also refer to the documentation for alternative solver options:\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n  n_iter_i = _check_optimize_result(\n/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n  _warn_prf(average, modifier, msg_start, len(result))\n/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n  _warn_prf(average, modifier, msg_start, len(result))\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 1000x600 with 1 Axes>","image/png":"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vHfvngMqAV6PiFsrTJo0SevWrXNwNXjbELwRXRhwGc/y9OdQbDtWCE6IsZycnPT3339rzJgxkqSFCxeqQYMGCggIcGxhwEt68g/NhAkT1LdvX6VMmTLW/cHBqwsPD7cG7zVr1mjfvn0EKbw2Tx9LFovFQZUgJnvyc2jbtm0KDQ2NdccKwQkxVmhoqCZNmqSZM2eqYcOGqlOnjqpVqyZvb29Hlwa8lIg/NAcOHNDly5c1evRo5c6d28FV4W1hjLEeQ926dVPr1q116tQp3b1717GF4Z3w5PE1depUdejQQSNGjNCJEyccXBlikiePk969e6tBgwZasGBBrDuBww1wEaM9fPhQderU0apVq1S7dm398ssvkqSwsDA5Ozs7uDrgxRhjdOjQIeXPn1+SNGXKFDVr1szBVeFtM3jwYI0fP14LFy5UwYIF5erq6uiS8JZ7sgWhe/fumjZtmnLlyqVbt27JYrFo0qRJKly4sIOrREzSu3dvTZkyRQsXLpSvr6+SJUvm6JKiFS1OiJEi8ryrq6sSJEigMmXK6J9//pGfn58kydnZWWFhYY4sEXiuiGPYGCOLxaK8efNq5syZkv7t4nDt2jVHloe3wJNncu/du6f169erT58++uijj3T9+nX99ttv+uqrrzRgwAAFBQU5sFK8rSJC06lTpxQYGKj169fL399fEyZM0Hvvvad69epp9+7dDq4SMcXff/+ttWvXasaMGSpevLicnZ31559/auDAgdq2bZsCAwMdXeIbF8fRBQBPi/iieeDAASVNmlSzZ89WQECAevfureXLl0v698xYRIvTzZs3lSRJEkeWDNh48izuo0ePFCdOHMWJE0cNGzbUw4cP1bp1a2XMmFHt27dXggQJHFssYqQnu8Vs2LBBqVOnlpOTky5duqSff/5ZS5cu1dWrV/X48WPt3LlT169f17hx42Ld9Qb47xYuXKguXbooWbJk6tu3rySpaNGicnNz03fffaf69evrxx9/pOUJevTokf766y/FiRNHe/bs0fTp07Vnzx7dunVL06ZN0+TJk1WhQgXr97h3ES1OiFEi3mxLly5VxYoVNW7cON26dUsJEiRQz549VaBAAa1YsUJDhgyRJPXp00dfffWVgoODHVw58K8nQ9P333+vL7/8UpUrV1aLFi304MEDtWrVShMnTlT//v01duxYrlNBJOHh4dYv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"},"metadata":{}}]},{"cell_type":"markdown","source":"# Create a new set of labels by using existing labels into 3 labels into Low medium and high arousal based ON letter that follows after \"A\" in labels\n\n# Used the new set of labels so that now there are 3 output classes and repeat steps below","metadata":{}},{"cell_type":"markdown","source":"\n\n\n","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"import pandas as pd\ncombined_features_ppg_gsr = pd.read_csv('/kaggle/input/combined-ppg-gsr-features/combined_features_ppg_gsr.csv')\nprint(combined_features_ppg_gsr.columns)\n# print(combined_features_ppg_gsr['subject_id'].head())\nprint(combined_features_ppg_gsr['arousal_valence_label'].head())\nprint(combined_features_ppg_gsr['arousal_valence_label'].iloc[0])\n\nprint(type(combined_features_ppg_gsr['arousal_valence_label'].iloc[0]))\nfirst_label =combined_features_ppg_gsr['arousal_valence_label'].iloc[0]\nletter = first_label[1]\nprint(letter)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T06:10:21.602479Z","iopub.execute_input":"2024-11-15T06:10:21.603000Z","iopub.status.idle":"2024-11-15T06:10:22.172082Z","shell.execute_reply.started":"2024-11-15T06:10:21.602944Z","shell.execute_reply":"2024-11-15T06:10:22.170870Z"},"trusted":true},"execution_count":21,"outputs":[{"name":"stdout","text":"Index(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n       ...\n       'vlf', 'lf', 'hf', 'tot_pow', 'lf_hf_ratio', 'peak_vlf', 'peak_lf',\n       'peak_hf', 'lf_nu', 'hf_nu'],\n      dtype='object', length=841)\n0    AMVM\n1    AMVL\n2    AMVM\n3    AMVM\n4    AMVM\nName: arousal_valence_label, dtype: object\nAMVM\n<class 'str'>\nM\n","output_type":"stream"}]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"# Function to categorize arousal based on the second letter of arousal_valence_label\ndef categorize_arousal_level(label):\n    second_letter = label[1]\n    if second_letter in ['L']:  # Adjust as needed for Low arousal\n        return 'Low'\n    elif second_letter in ['M']:  # Adjust as needed for Medium arousal\n        return 'Medium'\n    else:\n        return 'High'  # Remaining letters for High arousal\n\n# Apply the function to create the new labels\nnew_labels = combined_features_ppg_gsr['arousal_valence_label'].apply(categorize_arousal_level)\n\n# Prepare the features and new labels for classification\nfeatures_for_model = combined_features_ppg_gsr.drop(columns=['subject_id', 'video_id', 'arousal_valence_label'])\n# labels = new_labels_dataframe['arousal_level']\n\n\nprint(new_labels[:5])\nprint(new_labels[2334:])\nprint(new_labels.unique())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T06:11:15.329393Z","iopub.execute_input":"2024-11-15T06:11:15.329968Z","iopub.status.idle":"2024-11-15T06:11:15.349621Z","shell.execute_reply.started":"2024-11-15T06:11:15.329883Z","shell.execute_reply":"2024-11-15T06:11:15.348078Z"},"trusted":true},"execution_count":22,"outputs":[{"name":"stdout","text":"0    Medium\n1    Medium\n2    Medium\n3    Medium\n4    Medium\nName: arousal_valence_label, dtype: object\n2334       Low\n2335    Medium\nName: arousal_valence_label, dtype: object\n['Medium' 'Low' 'High']\n","output_type":"stream"}]},{"cell_type":"code","source":"# use new_labels\n# use features_for_model\n\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import StratifiedKFold, cross_val_score, train_test_split\nfrom sklearn.metrics import precision_score, recall_score, f1_score\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.svm import SVC\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.naive_bayes import GaussianNB\nimport matplotlib.pyplot as plt\n\n# Define the models\nmodels = {\n    'Random Forest': RandomForestClassifier(),\n    'Support Vector Classifier': SVC(),\n    'K-Nearest Neighbors': KNeighborsClassifier(),\n    'Logistic Regression': LogisticRegression(max_iter=1000),\n    'Naive Bayes': GaussianNB()\n}\n\n# Prepare cross-validation and store accuracies\nkfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)\nmodel_accuracies = {}\n\nfor name, model in models.items():\n    # Perform cross-validation\n    cv_accuracies = cross_val_score(model, features_for_model, new_labels, cv=kfold, scoring='accuracy')\n    model_accuracies[name] = cv_accuracies  # Store accuracy for each fold\n\n    # Print accuracy for each fold\n    print(f\"{name} - Cross-validation accuracies per fold: {cv_accuracies * 100}\")  # Convert to percentages\n    print(f\"{name} - Mean cross-validation accuracy: {np.mean(cv_accuracies) * 100:.2f}%\\n\")  # Convert to percentage\n\n# Calculate mean and standard deviation of cross-validation accuracies\nmean_accuracies = {name: np.mean(acc) * 100 for name, acc in model_accuracies.items()}  # Convert to percentages\nstd_accuracies = {name: np.std(acc) * 100 for name, acc in model_accuracies.items()}  # Convert to percentages\n\n# Plot the mean cross-validation accuracies with error bars for each model\nplt.figure(figsize=(10, 6))\nplt.bar(mean_accuracies.keys(), mean_accuracies.values(), yerr=std_accuracies.values(), capsize=5, color='skyblue')\nplt.xlabel('Machine Learning Algorithms')\nplt.ylabel('Mean Cross-Validation Accuracy (%)')\nplt.title('Comparison of Mean Cross-Validation Accuracy Across Models (Low, Medium, High Arousal)')\nplt.ylim(0, 100)  # Set y-axis limit for percentages\nplt.xticks(rotation=45)\nplt.show()\n\n# Train-test split for final evaluation\nX_train, X_test, y_train, y_test = train_test_split(features_for_model, new_labels, test_size=0.2, stratify=new_labels, random_state=42)\n\n# Initialize lists to store metrics\nprecision_scores = []\nrecall_scores = []\nf1_scores = []\n\nfor name, model in models.items():\n    # Train and predict on the test split\n    model.fit(X_train, y_train)\n    y_pred = model.predict(X_test)\n    \n    # Calculate metrics\n    precision = precision_score(y_test, y_pred, average='weighted')  # Remain as fraction\n    recall = recall_score(y_test, y_pred, average='weighted')  # Remain as fraction\n    f1 = f1_score(y_test, y_pred, average='weighted')  # Remain as fraction\n    \n    precision_scores.append(precision)\n    recall_scores.append(recall)\n    f1_scores.append(f1)\n\n# Create a DataFrame for the metrics and plot\nmetrics_df = pd.DataFrame({\n    'Model': list(models.keys()),\n    'Precision': precision_scores,\n    'Recall': recall_scores,\n    'F1-Score': f1_scores\n}).set_index('Model')\n\nmetrics_df.plot(kind='bar', figsize=(10, 6))\nplt.title('Model Comparison - Precision, Recall, and F1 Score')\nplt.xlabel('Machine Learning Algorithms')\nplt.ylabel('Score')\nplt.ylim(0, 1)  # Metrics remain in fraction (0 to 1)\nplt.xticks(rotation=45)\nplt.legend(loc=\"upper right\")\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T06:17:58.770825Z","iopub.execute_input":"2024-11-15T06:17:58.771368Z","iopub.status.idle":"2024-11-15T06:19:36.878124Z","shell.execute_reply.started":"2024-11-15T06:17:58.771322Z","shell.execute_reply":"2024-11-15T06:19:36.876540Z"},"trusted":true},"execution_count":25,"outputs":[{"name":"stdout","text":"Random Forest - Cross-validation accuracies per fold: [47.43589744 51.28205128 44.87179487 47.86324786 49.14529915 46.58119658\n 47.63948498 51.93133047 50.21459227 51.50214592]\nRandom Forest - Mean cross-validation accuracy: 48.85%\n\nSupport Vector Classifier - Cross-validation accuracies per fold: [50.         50.         50.         50.         50.         49.57264957\n 49.78540773 49.78540773 49.78540773 49.78540773]\nSupport Vector Classifier - Mean cross-validation accuracy: 49.87%\n\nK-Nearest Neighbors - Cross-validation accuracies per fold: [39.74358974 41.88034188 38.88888889 36.75213675 39.74358974 43.58974359\n 39.05579399 39.48497854 42.06008584 41.20171674]\nK-Nearest Neighbors - Mean cross-validation accuracy: 40.24%\n\nLogistic Regression - Cross-validation accuracies per fold: [50.         50.         50.         50.         50.         49.57264957\n 49.78540773 49.78540773 49.35622318 49.78540773]\nLogistic Regression - Mean cross-validation accuracy: 49.83%\n\nNaive Bayes - Cross-validation accuracies per fold: [17.09401709 17.94871795 17.09401709 16.23931624 17.52136752 16.66666667\n 20.17167382 16.30901288 23.60515021 17.16738197]\nNaive Bayes - Mean cross-validation accuracy: 17.98%\n\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 1000x600 with 1 Axes>","image/png":"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pk2b5OHhEW07aqMAAA97okRq06ZNmjp1qubPny9jjBo1aqShQ4eqVKlS8R0fAADxKqYmelEDKElS4cKFlSJFimcdFgDgORPnROrChQuaMWOGpk+frsOHD6tEiRIaOXKkmjZtqpQpUyZkjAAAAACQpMQ5kcqcObPSpUund999V23btlWePHkSMi4AAAAASLLiPPz53Llzde7cOY0YMcKeRH311Ve6ceNGQsUGAAAAAElSnBOpBg0ayNnZsQLryy+/1LVr1+I9qNh89dVXstls6tKli73s7t27+vDDD5UuXTqlTJlSDRs21KVLl55ZTAAAAABePnFOpGJijImvOB5rx44dmjhxogoWLOhQ3rVrVy1ZskTz5s3T+vXrdf78eTVo0OCZxQUAAADg5fNUidSzcuvWLTVv3lyTJ09WmjRp7OXBwcGaMmWKRo4cqYoVK6po0aKaNm2aNm/erK1btyZixAAAAABeZE81j9T+/fuVMWPG+IolVh9++KFq1qypypUr64svvrCX79y5U/fv31flypXtZYGBgcqSJYu2bNmiEiVKxLi/sLAwh4mDQ0JCEi54AHjOfbX7SmKHkODu3fm/4c+/3nNFrh53EjGaZ6NXkfSJHQIAPNcs10idOXNGZ8+elfRgJL8///xTXbp00aRJk+I9OEmaPXu2du3apSFDhkRbdvHiRbm6uip16tQO5T4+Prp48WKs+xwyZIi8vLzsP5kzZ47vsAEAAAC8wCwnUs2aNdO6deskPUhk3nzzTW3fvl19+vTR559/Hq/BnTlzRp07d1ZQUJDc3d3jbb+9e/dWcHCw/efMmTPxtm8AAAAALz7LidS+ffv0+uuvS3owJHr+/Pm1efNmBQUFafr06fEa3M6dO3X58mW9+uqrcnZ2lrOzs9avX6/vvvtOzs7O8vHx0b1796INwX7p0iX5+vrGul83Nzd5eno6/AAAAABAXFnuI3X//n25ublJklavXq06depIetA36cKFC/EaXKVKlbR3716HstatWyswMFCffvqpMmfOLBcXF61Zs0YNGzaUJB06dEinT59WyZIl4zUWAAAAAIhiOZHKly+fJkyYoJo1a2rVqlUaNGiQJOn8+fNKly5dvAaXKlUq5c+f36EsRYoUSpcunb28bdu26tatm9KmTStPT099/PHHKlmyZKwDTQAAAADA07KcSA0dOlT169fX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+/Ztvf/++xo3bpwGDhyo7777jr4wL5nIyEj7TUyfPn3UoUMHpUmTRqVKldLy5cvVpk0b5cqVS1988YW2bNmiokWLcuODWDk5OSl37tw6ePCgw7XktddeU8+ePfXaa6/pzTff1D///JN4QSLexdT3KXfu3GrQoIEaNmyoSpUqKXny5Pryyy919uxZpUmTRlu2bJHEYCT/hRopvNBsNpuWL1+u5s2ba8yYMapTp469tsnX11d9+/bV8OHDNXXqVP3000+6dOmSli1bJjc3t0SOHC+ThwcOmDZtmv73v//Jw8NDn332mfbu3asNGzbo/fffl5OTkzp27KiQkBANGDBAKVOmTOTI8SxEnR8XL17UxYsXNX78ePn5+Wnw4MFq1aqVbDabcubMaV//9OnTKly4cCJFi6Tk4Yc0URo2bKhUqVJpwIABeuedd/TDDz8oMDBQ0oNk6uOPP1auXLnsZXj+PXweLFy4UJcvX9a///6rjh07aurUqWrTpo2SJ09u75MrSWnSpFGGDBkSK+TnBoNN4IV27949tW/fXt7e3ho2bJhCQ0N1+vRp/fTTTwoICFDNmjWVKlUqbdmyRYcOHVK1atUcbkiAhPTwl9s///yjpk2baty4cSpTpowWL16sd999V0OGDFHHjh3t24wYMUKLFi3Spk2beEr4Evnhhx/03nvvKXv27Jo1a1a0RCkkJERHjx7V//73P505c0a7d++WszPPSl9mD19f1q9fr7CwMIWHh6tGjRqSpNWrV2v48OG6efOmpk2bpty5c0fbBwMxvVh69uypuXPnKjAwULdu3dL+/fs1c+ZMVatWTZIUGhqqU6dO6dNPP9Xp06e1c+dOriOPY4AX2L1790y5cuVMo0aNzMWLF817771nypcvb1555RXj4+NjOnfunNgh4iVUs2ZN888//ziUrVu3zmTNmtUYY8wvv/xiUqZMaSZMmGCMMebmzZtm2rRpJjw83BhjTGRkpMO/ePFdu3bN1KpVy9hsNrN48eJoyxcvXmzKlStnatasae7du2eMMfbzBS+37t27G39/f5M9e3bj4eFhqlatanbt2mWMMWblypWmatWqpnTp0mbfvn2JHCkS0o8//mh8fX3NX3/9ZYwx5rfffjM2m8388ssvxpgH3ycLFy405cqVM+XLl+c6Ekf0kcILxTxSweri4qIePXpo1apVypkzp65evar27dvr0KFD6tKli7Zu3aq7d+8mUrR4GW3YsEGvvvpqtJrPLFmyKF++fBoxYoSaN2+ur7/+Wh06dJAk7d+/X8uWLdPff/9tX9/QB+aFFVNfhjRp0igoKEhly5ZVp06dovVfqV27toYOHarFixfLxcVF4eHh1CRAkydP1owZM7R48WL9/vvv2rVrl06dOqXOnTvr2LFjqlKlij7++GPdvXtXo0ePTuxwkYDOnDmjJk2aqFChQpozZ44aNmyocePGqU6dOrp586aMMapQoYJ69uyp1atXcx2JI5r24YURdWP5xx9/aOPGjfr3339VuXJlVa9eXefPn9fx48dVunRp+3qdO3fWhQsX9MMPP8jd3T2xw8dLoEaNGipbtqx69OihZMmSadSoUXrjjTdUvHhxXb58WfXr19eWLVs0YMAA9evXT9KDuc8aNmwoDw8PzZs3L1p/B7xYHm6O9dtvv+n8+fPy9fVVjhw5lCtXLoWGhqpKlSq6dOmSFi9erLx580ZLqmPqF4MX3+LFi1WpUiWlSJHCXta5c2ddunRJs2fPtjfTu3z5sl577TVVqFBBM2bMkCRt3bpVr7/+OufNC6xdu3YKCwtTmzZtVLduXQ0dOlQffPCBJOmrr77SrVu39MUXX9jXp1lnHCVeZRgQ/xYsWGDSpUtnateubdq0aWNsNpvp1auXuXv3rn2dPXv2mN69exsvLy+zZ8+eRIwWL5NPP/3UZMyY0f77+fPnTbVq1UzatGnNjh07jDHGHDp0yPj4+JjKlSubzz//3EyePNlUqFDBFChQwN7MIiIiIlHix7PVo0cP4+3tbQoWLGi8vLxM6dKlzffff2+MMebWrVumdOnSJnfu3PZmOni5ffnll6ZWrVoOzX0jIiLMW2+9ZapXr24vu3PnjjHGmFmzZpmMGTOa06dPO+yH68uL5euvvzaDBw82xhizZs0aU6RIEePs7GzGjRtnX+fmzZumdu3apkuXLokV5nONRw94YRw6dEjdunXTl19+qcWLF+u7776zd5KMGoVvz549+vrrr7VkyRKtX79eBQsWTMyQ8ZK4f/++rl+/rqpVq0qSBg8erAMHDmjo0KGqXLmyatWqpW3btumVV17RmjVr5O3trblz52r27NnKnj27du3aZW9mwRPjF9+sWbM0Y8YMLVq0SLt379bvv/+ufPnyady4cQoKClKKFCn066+/ymaz2aduwMutd+/eWrRokWw2m3bv3q0bN27IyclJ7777rn7//Xf98MMPkmRvfWGMUYYMGeTp6emwH64vL467d+/q6NGj+vPPPyVJefPmVeHChRUYGKh79+4pJCREu3fvVpMmTXTu3DkNHz5cUvQuEniMxM7kgPiybds2U7ZsWWOMMUePHjUZM2Y07du3ty+PevK2Y8cOc/bs2USJES+v77//3thsNlOjRg1js9nMsWPHjDHG7N2717z11lvGx8fHbN261RhjzO3bt82tW7ccalLv37+fKHHj2fvss89M1apVHcr2799v3nrrLdO4cWN75+9bt27RERwO58DixYtN2rRpzfjx401ISIgJDQ01Xbp0MQEBAWbSpEkmNDTUnD9/3tSsWTNaDRZePMuWLTMeHh5mw4YNxhhjjh8/blq3bm1y5cplUqRIYYoUKWIqVKjAwBJPgUQKz62oL4CVK1eabdu2mc2bN5uAgACzdetWExAQYNq3b2+/KPz++++mZs2aJFB4pqKaYkUpWLCgcXFxMf/73/8cyqOSKV9fX/Pnn39G2w83Oy+HqGZVQ4YMMSVKlDDXrl1zWD5nzhzj7OxsTpw44VDOzc/LK6ameO+++64JDAw0kyZNMvfu3TNnzpwxvXv3Nm5ubiZTpkwmV65c5tVXX6W58Avkv74j3nnnHVO/fn1z48YNY4wxISEh5ty5c+bXX381+/fvt3/+PKx7MtTh4rlls9m0adMmNWjQQIcOHVKuXLmUL18+VaxYUSVKlNDEiRPtzRRWrFih27dvM9EunpnFixdr7NixioiIUEREhI4fP66UKVOqdevWGjJkiCZMmGAfMTJ//vzq37+/ypYtq2LFiunQoUMO+2J0vhePMSba6HxR16v8+fPrr7/+0oIFCxQREWFfnjFjRhUoUCBaB3A6hL+cHh5UZN68eVq5cqWkB3OOlSpVSkOHDtWMGTOUIUMGffnll/rrr780fPhwffPNN9q+fTvNhV8gUd8RQ4YM0eTJk7V79277smrVqmn//v26fv26JClFihTy9/dXjRo1lCdPHjk5OSkyMpL5op4QRw3PrVOnTmnZsmX67LPP9O6770p6MATw8ePH5erqqn/++Ud37tzR3LlzNXnyZG3YsEHp06dP5KjxsqhRo4Zq1aolJycnbdy4UWXKlNGqVauUPHly+fv766OPPpLN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NWs0Y8YMXb9+XQsXLrTPE8XAJM+3ZcuWaf369Tpx4oR69eqlV1991WF5nz59dP78eY0fP17u7u4aPny4Nm/erLRp02rSpEn25sDbtm1TunTpmF4jnvHXhSQh6mbh77//VuHChTVw4EB7IpU8eXIdO3ZMhw8fVqZMmew3nuXLl5efn58uXLhg3w9JFJ6Vh29w586dq4wZM6pUqVJq2bKlvv32W61Zs0YdO3ZUlSpVVLx4cQ0cOFB79+6Vq6urfR8kUS+m69ev6+TJk6patap+//13RUZGat68efr5558VHh6uoKAgvfnmm5o3b55q166ttm3bymazaeTIkcqdO7f69OkjSdwEw87Ly0suLi5au3at0qRJo6lTp+ry5ctKkyaN5s2bpzt37ujrr7+Wt7e38uXLx+iOL4jJkyerd+/eKl++vM6dO6cyZcror7/+Uq5cuezrHD58WGfOnJG7u7vu37+vrVu3qkKFCurUqZOk/7uOFC9ePLHexostUevDAPN/1dW7d+82Hh4epk+fPg7L7927Z2rVqmUaNGhgdu7caS8PCwszr732mpk2bdqzDBdwaJL36aefGj8/PzNlyhRz9epVY4wxly5dMufPn3fYplq1atH6wuDFdf78edOgQQOTLl06880335hBgwbZl925c8d8+OGHxs3NzSxZssQY86DPVFBQkH3+MJp9vrxia9L5zTffmFKlShk3NzfTq1cvs379emOMMZ988onD3GT/tQ88PyZOnGicnZ3NwoULTXh4uLl+/bopVKiQWbZsmcPcg7/88ovJnj27efXVV02xYsVM3rx57c06uY4kPJr2IUk4dOiQChUqpH79+umzzz6zly9dulTly5fXmjVrNHLkSHl5eal9+/YKCAjQDz/8oGnTpmn79u3Kli1b4gWPl9bQoUM1cuRILV26VIULF7bPAxVVW3X9+nXt2LFD3377rU6fPq3du3fL2dmZmqgX2MM1lRcuXFCnTp20YMECtWnTRt9//739s7979666d++u6dOna9q0aWrUqJF9Hwxx/vJ6+PyZPn26/vrrL0VERKhMmTJq3Lixbt26pYsXLzo0zypfvryKFi2qr7/+OrHCRjz79ddfVbt2bf3www9655137OW5c+dW3rx5tXfvXtWpU0fvvvuu8ufPr2XLlum3335TqlSp9MUXX8jZ2ZnryDNCnS8S3d27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"},"metadata":{}},{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n  _warn_prf(average, modifier, msg_start, len(result))\n/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n  _warn_prf(average, modifier, msg_start, len(result))\n/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n  _warn_prf(average, modifier, msg_start, len(result))\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 1000x600 with 1 Axes>","image/png":"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8mWNHj3aOm+zZs30008/6YsvvtCHH36ozZs3q1KlSpFquH79ugoXLiyLxaK2bdsqadKkWrt2rZo2baqAgAB16NDhpfZpxYoVihs3rmrVqvVC8/fr10/9+/dX6dKl9dVXX+nUqVOaNGmS9u/fr507d8rFxcU67927d1W5cmXVrVtXn332mSZNmqS6detq7ty56tChg1q1aqUvvvhCw4cPV61atXTp0iXFjx/fZnu1a9dWhgwZ5Ofnpz179mjs2LG6e/eu5syZY51n0qRJyp49u6pWrao4ceJo5cqVat26tcLCwtSmTRub9Z06dUqff/65WrZsqebNmytr1qzP3E8/Pz81a9ZMBQsWVEBAgA4cOKBDhw6pTJkykqSNGzeqQoUKypgxo/r166dHjx5p3LhxKlq0qA4dOqQMGTJE2hcfHx/5+fnp0KFDmjZtmpIlS6Zhw4a90Gv/X4R/uU+cOLF12u3bt1WhQgXVrVtX9erVU/LkyRUWFqaqVatqx44datGihd5//30dPXpUo0eP1l9//aVly5ZZl+/fv7/69eunDz/8UAMGDJCrq6v27t2rzZs3q2zZslHWMXXqVLVr1061atWyhuA//vhDe/fufW5XqJc97sqXL68aNWqodu3aWrRokbp27aqcOXNa37evQ3iwS5gwoXXa5s2bVaFCBeXLl099+/aVk5OTNdhv377d2jJ15coVFSxYUPfu3VOLFi3k6+ury5cva9GiRXr48KFcXV117tw5LVu2TJ999pl8fHx0/fp1/fDDDypRooSOHz+uVKlSvbZ9iehltzt06FA5OTnpm2++kb+/v7777jt9+eWX2rt3r3We6dOnq2XLlvrwww/VoUMHnTt3TlWrVlWiRImUNm3aF6rryZMnkVr1PTw8Xlsrafr06bVp0yb9888/SpMmzXPnbdq0qWbNmqUKFSqoWbNmCgkJ0fbt27Vnzx7lz59f0r+f6bNnz1atWrXUuXNn7d27V35+fjpx4oSWLl1qs76oPpcePnyoEiVK6PLly2rZsqXSpUunXbt2qXv37rp69arGjBnzWvYbiNEMgLfOzJkzjSSzf/9+M378eBM/fnzz8OFDY4wxn332mSlVqpQxxpj06dObSpUqWZdbtmyZkWQGDRpks75atWoZi8Vizpw5Y4wx5siRI0aSad26tc18X3zxhZFk+vbta53WtGlTkzJl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urS9DrVr19bly5ejvHfXo0ePFBgYKEmqXr26nJycNGDAgEitEM9raXj6dXV1dVW2bNlkjNGTJ0+iXMYRx92L+PLLL5UmTRrrqIj58uVTpkyZNGLECJvuleHC359OTk6qXr26Vq5caTN8dbjwfXR2do70Wi5cuFCXL19+3bti43VvN3/+/EqaNKkmT55sHWpd+nfY+aeHk3ekTZs2RTk9/Hql8JNaNWvWlDEmyhbS8Nct/P3/9Gd4eEvuixyztWvX1u7du7V+/fpIz927d08hISF21wG87WhxAt4RL9Jlo0qVKipVqpR69uypCxcuKHfu3Pr111+1fPlydejQwXqGOk+ePPr88881ceJE+fv768MPP9SmTZuivBfK0KFDtWXLFhUqVEjNmzdXtmzZdOfOHR06dEgbN2584W5A4RImTKilS5eqYsWKypMnj+rVq6d8+fJJkg4dOqSff/7ZesPUpEmTqnv37urfv7/Kly+vqlWr6tSpU5o4caIKFCjw3JtTvqrz58+ratWqKl++vHbv3m0dsj38LHXZsmXl6uqqKlWqqGXLlnrw4IGmTp2qZMmSWc8Qv4ps2bKpZMmSypcvnxIlSqQDBw5o0aJFatu2rXWe4cOHq0KFCipSpIiaNm1qHY7c29tb/fr1+6+77hD169fXggUL1KpVK23ZskVFixZVaGioTp48qQULFljvNZM5c2b17NnTegF9jRo15Obmpv379ytVqlTy8/OLcv1ly5ZVihQpVLRoUSVPnlwnTpzQ+PHjValSpWcOUvKmjruSJUvqt99+e+UuZS4uLmrfvr26dOmidevWqXz58po2bZoqVKig7Nmzq3HjxkqdOrUuX76sLVu2yMvLSytXrpT0b3e4X3/9VSVKlLAO+3716lUtXLhQO3bsUIIECVS5cmUNGDBAjRs31ocffqijR49q7ty5L3VdUEThQ7pv2bIl0r21Inrd23VxcdGgQYPUsmVLffzxx6pTp47Onz+vmTNnvvI6n2X8+PG6d++erly5IunfFunw++F9/fXXzx2Molq1avLx8VGVKlWUKVMmBQYGauPGjVq5cqUKFChgPUlWqlQp1a9fX2PHjtXp06dVvnx5hYWFafv27SpVqpTatm2r3Llzq2HDhpoyZYru3bunEiVKaN++fZo9e7aqV6+uUqVK2d2XLl26aMWKFapcubIaNWqkfPny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wqxfOnr27KmWLVsqYcKEKlq0qNauXasmTZooS5YsGjRokHbv3q18+fK9019U8GY5OTkpa9asOnnypM3nUf78+fXtt98qf/78KlOmjI4dO+a4IhHtorp2KWvWrKpRo4Zq1qypTz75RB4eHhoyZIj++ecfJUyYULt375b0bg8uQosTYhSLxaK1a9fqyy+/1Pjx41W1alVra1KKFCnUu3dvDR8+XDNmzNBPP/2k69eva82aNXJzc3Nw5cC/Il7EP3PmTPXq1Utx48ZVjx49dPToUW3btk2tWrWSk5OTWrdurYCAAPXr10+enp4OrhwxRfgxdO3aNV27dk2TJk1SypQpNXjwYDVq1EgWi0WZM2e2zn/x4kXlyZPHQdXibRLxxE64mjVrKn78+OrXr5/q1aunOXPmyNfXV9K/4enrr79WlixZrNPw7ot4nCxZskQ3btzQzZs31bp1a82YMUNNmjSRh4eH9bpdSUqYMKGSJk3qqJKjDYNDIEYJDg5WixYtlCxZMn333XcKDAzUxYsX9dNPP8nHx0eVKlVS/PjxtXv3bp06dUrly5e3+QIBOErEPzTHjh1T3bp1NXHiRBUrVkwrVqxQ/fr15efnp9atW1uXGTFihJYuXaodO3a802fo8PLmzJmj5s2bK2PGjPr5558jBaOAgACdOXNGvXr10qVLl3T48GHFicO5UDxbxM+o3377TUFBQQoJCVHFihUlSRs3btTw4cN1//59zZw5U1mzZo20DgZmil2+/fZbLViwQL6+vnrw4IGOHz+uefPmqXz58pKkwMBA/f333+ratasuXryogwcPvvufQwaIQYKDg02JEiXMZ599Zq5du2aaN29uSpYsad577z2TPHly0759e0eXCNioVKmSOXbsmM20LVu2mPTp0xtjjFm+fLnx9PQ0kydPNsYYc//+fTNz5kwTEhJijDEmLCzM5l/AGGPu3LljKleubCwWi1mxYkWk51esWGFKlChhKlWqZIKDg40xxnpMAc/zzTffmFSpUpmMGTOauHHjmnLlyplDhw4ZY4xZv369KVeunPnoo4/Mn3/+6eBK4Ug//vijSZEihTly5Igxxphff/3VWCwWs3z5cmPMv3+zlixZYkqUKGFKliwZaz6HuMYJDmWeavB0cXFRly5dtGHDBmXOnFm3b99WixYtdOrUKXXo0EF79uzR48ePHVQtYGvb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"},"metadata":{}}]},{"cell_type":"code","source":"ppg_all_features = pd.read_csv(\"/kaggle/input/ppg-extracted-features/ppg_all_features.csv\")\n\nprint(ppg_all_features.columns)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T06:22:14.277288Z","iopub.execute_input":"2024-11-15T06:22:14.277876Z","iopub.status.idle":"2024-11-15T06:22:14.337391Z","shell.execute_reply.started":"2024-11-15T06:22:14.277828Z","shell.execute_reply":"2024-11-15T06:22:14.335886Z"},"trusted":true},"execution_count":26,"outputs":[{"name":"stdout","text":"Index(['mean', 'var', 'median', 'max', 'min', 'range', 'rmssd', 'sdsd',\n       'nni_50', 'pnni_50', 'nni_20', 'pnni_20', 'avg_hr', 'std_hr', 'min_hr',\n       'max_hr', 'energy', 'abs_sum_diff', 'subject_id', 'video_id',\n       'arousal_valence_label', 'vlf', 'lf', 'hf', 'tot_pow', 'lf_hf_ratio',\n       'peak_vlf', 'peak_lf', 'peak_hf', 'lf_nu', 'hf_nu'],\n      dtype='object')\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# 3 categories with only PPG","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import StratifiedKFold, cross_val_score, train_test_split\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.svm import SVC\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.naive_bayes import GaussianNB\nimport matplotlib.pyplot as plt\n\n# Step 1: Define function to categorize arousal level\ndef categorize_arousal_level(label):\n    second_letter = label[1]\n    if second_letter == 'L':\n        return 'Low'\n    elif second_letter == 'M':\n        return 'Medium'\n    else:\n        return 'High'\n\n# Step 2: Apply categorization function to generate new labels\nppg_all_features['new_labels'] = ppg_all_features['arousal_valence_label'].apply(categorize_arousal_level)\n\n# Step 3: Prepare features and labels\nfeature_columns = [\n    'mean', 'var', 'median', 'max', 'min', 'range', 'rmssd', 'sdsd', 'nni_50', \n    'pnni_50', 'nni_20', 'pnni_20', 'avg_hr', 'std_hr', 'min_hr', 'max_hr', \n    'energy', 'abs_sum_diff', 'vlf', 'lf', 'hf', 'tot_pow', 'lf_hf_ratio', \n    'peak_vlf', 'peak_lf', 'peak_hf', 'lf_nu', 'hf_nu'\n]\nfeatures = ppg_all_features[feature_columns]\nlabels = ppg_all_features['new_labels']\n\n# Step 4: Define the models\nmodels = {\n    'Random Forest': RandomForestClassifier(),\n    'Support Vector Classifier': SVC(),\n    'K-Nearest Neighbors': KNeighborsClassifier(),\n    'Logistic Regression': LogisticRegression(max_iter=1000),\n    'Naive Bayes': GaussianNB()\n}\n\n# Step 5: Perform Stratified Cross-Validation and store accuracies\nkfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)\nmodel_accuracies = {}\n\nfor name, model in models.items():\n    # Perform cross-validation\n    cv_accuracies = cross_val_score(model, features, labels, cv=kfold, scoring='accuracy')\n    model_accuracies[name] = cv_accuracies  # Store accuracy for each fold\n\n    # Print accuracy for each fold\n    print(f\"{name} - Cross-validation accuracies per fold: {cv_accuracies * 100}\")  # Convert to percentages\n    print(f\"{name} - Mean cross-validation accuracy: {np.mean(cv_accuracies) * 100:.2f}%\\n\")  # Convert to percentage\n\n# Calculate mean and standard deviation of cross-validation accuracies\nmean_accuracies = {name: np.mean(acc) * 100 for name, acc in model_accuracies.items()}  # Convert to percentages\nstd_accuracies = {name: np.std(acc) * 100 for name, acc in model_accuracies.items()}  # Convert to percentages\n\n# Step 6: Plot the mean cross-validation accuracies with error bars\nplt.figure(figsize=(10, 6))\nplt.bar(mean_accuracies.keys(), mean_accuracies.values(), yerr=std_accuracies.values(), capsize=5, color='skyblue')\nplt.xlabel('Machine Learning Algorithms')\nplt.ylabel('Mean Cross-Validation Accuracy (%)')\nplt.title('Comparison of Mean Cross-Validation Accuracy Across Models (Low, Medium, High Arousal)')\nplt.ylim(0, 100)\nplt.xticks(rotation=45)\nplt.show()\n\n# Step 7: Train-test split for final evaluation and compute metrics\nX_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, stratify=labels, random_state=42)\n\n# Initialize lists to store metrics\nprecision_scores = []\nrecall_scores = []\nf1_scores = []\n\nfor name, model in models.items():\n    # Train and predict on the test split\n    model.fit(X_train, y_train)\n    y_pred = model.predict(X_test)\n    \n    # Calculate metrics (precision, recall, F1 score remain in 0-1 range)\n    precision = precision_score(y_test, y_pred, average='weighted')\n    recall = recall_score(y_test, y_pred, average='weighted')\n    f1 = f1_score(y_test, y_pred, average='weighted')\n    \n    precision_scores.append(precision)\n    recall_scores.append(recall)\n    f1_scores.append(f1)\n\n# Step 8: Create a DataFrame for the metrics and plot\nmetrics_df = pd.DataFrame({\n    'Model': list(models.keys()),\n    'Precision': precision_scores,\n    'Recall': recall_scores,\n    'F1-Score': f1_scores\n}).set_index('Model')\n\nmetrics_df.plot(kind='bar', figsize=(10, 6))\nplt.title('Model Comparison - Precision, Recall, and F1 Score')\nplt.xlabel('Machine Learning Algorithms')\nplt.ylabel('Score')\nplt.ylim(0, 1)\nplt.xticks(rotation=45)\nplt.legend(loc=\"upper right\")\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T06:27:57.026787Z","iopub.execute_input":"2024-11-15T06:27:57.027417Z","iopub.status.idle":"2024-11-15T06:28:15.259345Z","shell.execute_reply.started":"2024-11-15T06:27:57.027370Z","shell.execute_reply":"2024-11-15T06:28:15.258183Z"},"trusted":true},"execution_count":27,"outputs":[{"name":"stdout","text":"Random Forest - Cross-validation accuracies per fold: [51.70940171 54.27350427 47.00854701 49.57264957 52.56410256 51.70940171\n 53.64806867 51.93133047 53.64806867 53.21888412]\nRandom Forest - Mean cross-validation accuracy: 51.93%\n\nSupport Vector Classifier - Cross-validation accuracies per fold: [50.         50.         50.         50.         50.         49.57264957\n 49.78540773 49.78540773 49.78540773 49.78540773]\nSupport Vector Classifier - Mean cross-validation accuracy: 49.87%\n\nK-Nearest Neighbors - Cross-validation accuracies per fold: [37.60683761 41.02564103 38.03418803 33.33333333 36.32478632 40.17094017\n 36.05150215 34.33476395 39.05579399 42.48927039]\nK-Nearest Neighbors - Mean cross-validation accuracy: 37.84%\n\nLogistic Regression - Cross-validation accuracies per fold: [50.         50.         50.         50.         50.         49.57264957\n 49.78540773 49.78540773 49.78540773 49.78540773]\nLogistic Regression - Mean cross-validation accuracy: 49.87%\n\nNaive Bayes - Cross-validation accuracies per fold: [50.         50.         50.         49.14529915 48.71794872 50.\n 48.92703863 49.78540773 49.78540773 49.35622318]\nNaive Bayes - Mean cross-validation accuracy: 49.57%\n\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 1000x600 with 1 Axes>","image/png":"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55/4CxKxLrq+Tzlz5lS9evVUv359VahQQYkTJ9aXX36pc+fOKUWKFNq6daskBiP5L9RI4ZVms9m0YsUKNWvWTOPHj1etWrXstU0+Pj7q16+fRowYoRkzZuj777/X5cuXtXz5crm5ucVz5HidPDpwwMyZM/W///1PHh4e+uyzz7Rv3z5t3LhRH374oZycnNShQwcFBwdr4MCBSpo0aTxHjhch8vy4dOmSLl26pEmTJsnX11dDhgxRy5YtZbPZlD17dvv6Z86cUcGCBeMpWiQkjz6kiVS/fn0lS5ZMAwcO1Hvvvac5c+bI399f0sNk6pNPPlGOHDnsZXj5PXoeLF68WFeuXNG///6rDh06aMaMGWrdurUSJ05s75MrSSlSpFCaNGniK+SXBoNN4JV2//59tWvXTt7e3ho+fLhCQkJ05swZff/998qSJYuqV6+uZMmSaevWrTp8+LCqVKnicEMCxKVHv9z++ecfNWnSRBMnTlRAQICWLFmi999/X0OHDlWHDh3s24wcOVI//fSTNm/ezFPC18icOXP0wQcfKGvWrJo3b16URCk4OFjHjh3T//73P509e1a7d++WszPPSl9nj15fNmzYoNDQUIWFhalatWqSpDVr1mjEiBG6deuWZs6cqZw5c0bZBwMxvVp69eqlBQsWyN/fX7dv39aBAwc0d+5cValSRZIUEhKi06dP69NPP9WZM2e0a9curiNPY4BX2P37902ZMmVMw4YNzaVLl8wHH3xgypYta9544w2TNm1a07lz5/gOEa+h6tWrm3/++cehbP369SZTpkzGGGN++eUXkzRpUjN58mRjjDG3bt0yM2fONGFhYcYYYyIiIhz+xavv+vXrpkaNGsZms5klS5ZEWb5kyRJTpkwZU716dXP//n1jjLGfL3i99ejRw/j5+ZmsWbMaDw8PU7lyZfPXX38ZY4xZtWqVqVy5silVqpTZv39/PEeKuPTdd98ZHx8fs2fPHmOMMb/99pux2Wzml19+McY8/D5ZvHixKVOmjClbtizXkRiijxReKeaxClYXFxf17NlTq1evVvbs2XXt2jW1a9dOhw8fVpcuXbRt2zbdu3cvnqLF62jjxo166623otR8ZsyYUXny5NHIkSPVrFkzjRo1Su3bt5ckHThwQMuXL9fff/9tX9/QB+aVFV1fhhQpUigwMFClS5dWp06dovRfqVmz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"},"metadata":{}},{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n  _warn_prf(average, modifier, msg_start, len(result))\n/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n  _warn_prf(average, modifier, msg_start, len(result))\n/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n  _warn_prf(average, modifier, msg_start, len(result))\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 1000x600 with 1 Axes>","image/png":"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NatOnDhh83mUP39+ffvtt8qfP7/KlCmjo0ePOq5IRLuorl3KmjWratSooZo1a+qTTz6Rh4eHhgwZon/++UcJEybUrl27JL3bg4vQ4oQYxWKxaO3atfryyy81fvx4Va1a1dqalCJFCvXu3VvDhw/XjBkz9NNPP+natWtas2aN3NzcHFw58K8nL+KfOXOmevXqpbhx46pHjx46cuSItm7dqlatWsnJyUmtW7dWYGCg+vXrJ09PTwdXjpgi4hi6evWqrl69qkmTJillypQaPHiwGjVqJIvFosyZM1vnv3DhgvLkyeOgavE2efLEToSaNWsqfvz46tevn+rVq6c5c+bI19dX0r/h6euvv1aWLFms0/Due/I4WbJkia5fv64bN26odevWmjFjhpo0aSIPDw/rdbuSlDBhQiVNmtRRJUcbBodAjBISEqIWLVooWbJk+u677xQUFKQLFy7op59+ko+PjypVqqT48eNr165dOnnypMqXL2/zBQJwlCf/0Bw9elR169bVxIkTVaxYMa1YsUL169eXn5+fWrdubV1mxIgRWrp0qbZv3/5On6HDy5szZ46aN2+ujBkz6ueff44UjAIDA3X69Gn16tVLFy9e1KFDhxQnDudC8WxPfkb99ttvCg4OVmhoqCpWrChJ2rhxo4YPH6579+5p5syZypo1a6R1MDBT7PLtt99qwYIF8vX11f3793Xs2DHNmzdP5cuXlyQFBQXp77//VteuXXXhwgUdOHDg3f8cMkAMEhISYkqUKGE+++wzc/XqVdO8eXNTsmRJ895775nkyZOb9u3bO7pEwEalSpXM0aNHbaZt3rzZpE+f3hhjzPLly42np6eZPHmyMcaYe/fumZkzZ5rQ0FBjjDHh4eE2/wLGGHP79m1TuXJlY7FYzIoVKyI9v2LFClOiRAlTqVIlExISYowx1mMKeJ5vvvnGpEqVymTMmNHEjRvXlCtXzhw8eNAYY8z69etNuXLlzEcffWT+/PNPB1cKR/rxxx9NihQpzOHDh40xxvz666/GYrGY5cuXG2P+/Zu1ZMkSU6JECVOyZMlY8znENU5wKPNUg6eLi4u6dOmiDRs2KHPmzLp165ZatGihkydPqkOHDtq9e7cePXrkoGoBW1u3blXevHkjtXqmS5dO2bNn14gRI/Tll19q5MiRatmypSTp2LFjWrNmjf744w/r/IbrU2K1qK4lSJgwoebOnavixYurXbt2ka4vqVKlioYNG6YVK1bIxcVFoaGhtATArqlTp2r27NlasWKFtmzZooMHD+rvv/9W+/btdebMGZUtW1Zff/21Hj16pHHjxjm6XDjQxYsXVadOHeXOnVvz589XzZo1NXHiRFWtWlX37t2TMUalSpXSt99+q40bN8aazyG66sFhIr4s7tixQ9u2bdONGzdUunRpVahQQZcvX9bZs2f10UcfWedr3769rly5ojlz5sjd3d3R5SOWq1ixoooXL64uXbrI2dlZo0eP1ocffqhChQrp+vXr+vTTT7Vr1y7169dPffr0kfTvfclq1qypuHHjauHChZGuNUDs82T3qV9//VWXL19WihQplClTJmXJkkVBQUEqW7asrl27phUrVihbtmyRgnZU160AK1as0CeffKJ48eJZp7Vv317Xrl3TL7/8Yu12d/36deXPn1+lSpXS7NmzJUm7d+9WwYIFOa5isWbNmik4OFhNmjRRtWrVNGzYMH311VeSpKFDh+r+/fsaNGiQdf5Y043TcY1dgDGLFy82iRMnNlWqVDFNmjQxFovFdOvWzTx69Mg6z++//266d+9uvL29ze+//+7AaoF/de3a1aROndr6+PLly6Z8+fImUaJEZt++fcYYY06ePGmSJ09uSpcubQYMGGCmTp1qSpUqZXLmzGnt0hAWFuaQ+hHzdOnSxSRLlszkypXLeHt7m48++shMmzbNGGPM/fv3zUcffWSyZs1q7TYDPM+QIUNM5cqVbboAh4WFmVq1apkKFSpYpz18+NAYY8zPP/9sUqdObS5cuGCzHj6jYpeRI0eawYMHG2OM8ff3Nx988IGJEyeOmThxonWee/fumSpVqpgOHTo4qkyH4lQCHObkyZPq1KmThgwZohUrVmjs2LHWiwojRsn7/fffNXLkSK1cuVK//fabcuXK5ciSAT1+/Fh37txRuXLlJEmDBw/W8ePHNWzYMJUuXVqVK1fWnj179N5778nf31/JkiXTggUL9Msvvyhjxow6ePCgtUsDZ3MhST///LNmz56tpUuX6tChQ9qyZYuyZ8+uiRMnau7cuYoXL55Wr14ti8VivRUD8Dzdu3fX0qVLZbFYdOjQId29e1dOTk6qX7++tmzZojlz5kiStfeGMUZJkyaVl5eXzXr4jIo9Hj16pNOnT2v//v2SpGzZsilPnjzy9fVVSEiIAgMDdejQIdWpU0eXLl3S8OHDJUW+5OKd5+jkhthrz549pnjx4sYYY06fPm1Sp05tWrRoYX0+4szXvn37zD///OOQGoGoTJs2zVgsFlOxYkVjsVjMmTNnjDHGHDlyxNSqVcskT57c7N692xhjzIMHD8z9+/dtWlEfP37skLoRM/Xo0cOUK1fOZtqxY8dMrVq1TO3ata0XW9+/f/+dv/Aa/92Tx8iKFStMokSJzKRJk0xgYKAJCgoyHTp0MD4+PmbKlCkmKCjIXL582VSqVClSCxVinzVr1pi4ceOarVu3GmOMOXv2rGncuLHJkiWLiRcvnvnggw9MqVKlYs1AEFEhOCHaRHwgr1+/3uzZs8fs3LnT+Pj4mN27dxsfHx/TokUL65twy5YtplKlSgQmxBgR3aYi5MqVy7i4uJhevXrZTI8ITylSpDD79++PtB6+mCBCRDcoPz8/U7hwYXP79m2b5+fPn2/ixIljzp07ZzM9Nn5ZwYuJqmtd/fr1ja+vr5kyZYoJCQkxFy9eNN27dzdubm4mTZo0JkuWLCZv3rx0IY5Fnvd3qF69eubTTz81d+/eNcYYExgYaC5dumRWr15tjh07Zj0+YusJQNpgEW0sFou2b9+uGjVq6OTJk8qSJYuyZ8+ujz/+WIULF9YPP/xg7Rawbt06PXjwgBvbIkZYsWKFJkyYoLCwMIWFhens2bPy9PRU48aN5efnp8mTJ1tHe8yRI4f69u2r4sWLq0CBAjp58qTNuhg9L3YyxkQaPS/i8y5Hjhw6fPiwFi9erLCwMOvzqVOnVs6cOSNdcB0rLsDGS3tykJCFCxdq/fr1kv69J1jRokU1bNgwzZ49W0mTJtWQIUN0+PBhDR8+XGPGjNHevXvpQhyLRPwd8vPz09SpU3Xo0CHrc+XLl9exY8d0584dSVK8ePGUKlUqVaxYUe+//76cnJwUHh7+7t+v6Rli517DIf7++2+tWbNGPXr0UP369SX9O6Tu2bNn5erqqqNHj+rhw4dasGCBpk6dqq1btypJkiQOrhr4dwS9ypUry8nJSdu2bVOxYsW0YcMGeXh4KFWqVGrbtq0sFosaNWokNzc35ciRQ926dVOWLFm4QTMk/ftFJeLLyuLFixUQECBJ+vzzz1W5cmX17NlTrVq10r179/Thhx8qZcqUGjBggLy9vZU6dWpHlo63gDHGGni6du2qxYsXq1WrVsqTJ4+SJ0+uadOmqXHjxho6dKiMMapVq5Z8fX3l6+trXUdYWFis/TIcGxljdPHiRf3yyy969OiRKleurGbNmunLL7/UlClT1K9fP82aNSvKIB2rw7VjG7wQWxw/ftwUKVLEpE+f3mZ0FmOMGTFihClZsqRxcnIyuXPnNnnz5jWHDh1yTKHAcxw4cMBYLBbTu3dvm+n9+/c3zs7O5ocffrC5likCXatir/bt25sGDRpYH7dr184kTJjQ+Pr6mrRp05p06dJZrycYOnSoSZs2rUmUKJHJli2bKViwIN2n8FL8/PxMkiRJrNdYPq1Zs2Yma9asZvTo0SYoKCiaq4MjPesz5Pjx42bBggXG19fXFCpUyFSpUsX06NHDFChQwPz111/RXGXMR3BCtGnfvr1JmDChqVatmrXvbITAwECze/du8/fff5ubN286qELA1pN/aCL6hE+aNMm4u7ubvn372sw7YMAA4+bmZkaOHGn9sovY7f79+6Zv374mZ86cpkOHDubMmTOmRIkS5vDhw+bWrVvmxo0bpnLlyiZZsmTmjz/+MMb8e43crl27zJYtW2L9tQR4ceHh4ebWrVumTJkyZubMmcYYY86dO2dWr15tPvvsM9OpUyfrcVS9enVTp04drreMRZ78W7Zz506zfv16s23bNpt57t69a3799VdTo0YNkyBBAmOxWMz48eOju9QYjxvg4o0wT92gMULXrl21atUq1alTR+3atVOCBAmivzjgBTx5vcDPP/+sBAkSqGTJknJzc9P06dPVunVr9ezZU/369bMu06VLF+3Zs0e//fYb1zJBknTnzh3NmDFDP/30k5IlSyZJWrp0qeLGjWs9Rj7++GPdu3dP+/bti7R8rLmpJF5aVDc+/vjjjxU/fny1bNlSkyZN0p07d5QqVSqtW7dOderU0dSpU22Wfdbfarw7nvwd9+jRQ0uWLFFgYKAyZMigLFmyWG96/KRdu3bpl19+0caNG7V27VqlS5cuusuOsWJxJ0W8KRFv0j179mjUqFEaP368Vq9eLUkaNmyYypcvr+XLl2vcuHG6e/eudRkgpjBPXS/QqVMnXb9+Xffv35eTk5MaNmyoCRMmaNCgQTbBafjw4dbQxDENY4wSJkyoxo0b64svvtA///yjM2fOyMPDQxaLxTqgSLdu3XT9+vVIA4lIDASBqD0ZmiLucyhJjRs31u3bt/XZZ58pV65c8vPz04IFC/TNN98oMDBQwcHBkmS9wJ/Q9O6L+B0PHTpUM2bM0PTp03Xu3DmVKFFCP/74o6pVq2adN+L4KFKkiOrVq6fHjx/r4sWLDqk7xnJUUxfeTRFN/4sWLTLx48c3xYoVMzlz5jRx4sQxHTt2tM7XoUMHU6hQIdO1a9dI3faAmGLEiBEmRYoUZu/evTbdWiK6vEyaNMm4urraHNvGMOR4bBfVtQTXr183I0aMMAkSJDBNmza1eW7r1q0mXbp05vjx49FVIt5iT36+fPvttyZLlixmwoQJJigoyDx69Mjcv3/fem+5CCVLljTt2rWL7lIRQ5w8edKUKVPGrFmzxhhjzNq1a42np6f56quvTJo0aUyNGjWs8z7ZNdjX15fuek8hOOE/ieoLwqlTp0zKlCmtg0Dcvn3b/PLLL8bDw8N07tzZOl+LFi1MyZIlzY0bN6KtXuBFhYSEmE8//dT06dPHGPPv9QIrVqwwlStXNs2aNTNHjhwxxhgzatQoU6xYMcISjDHGBAcHW/+/d+9es3//fnPp0iVjjDG3bt0yw4cPN5kzZzZffPGF+euvv8z+/ftN+fLlTZEiRRgAAi9lyJAhJmnSpGb79u1RHjuBgYHmt99+M+XKlTO5cuXiWrlY5uljYubMmebq1atmx44dJnXq1OaHH34wxhjTsmVLY7FYTNGiRW3m/+WXX0yCBAnMyZMno63mtwHXOOGVRXQVOHLkiC5fvqxy5cpJkvbs2aMGDRrI399fadKksc4/b948NWvWTKtWrdLHH38sSbp+/bq13z/gSE92fQkPD1dYWJhq1qwpLy8vFSpUSOvWrbMO1/vo0SN5eHho0aJFkiQXFxdr9zy6vsRODRs2VLt27ZQvXz5J/3a/mzp1qjw9PRUSEqIFCxaoWLFiun37tmbOnKmBAwcqPDxc1atXl7Ozs6ZMmSIXF5cor1sBnnbz5k3VqFFDzZo1U4MGDXThwgWdPHlSP//8s1KlSqVBgwbJ399fs2fP1p07d7RkyRLrfZoYcvzdtmbNGv322286d+6cunXrprx589o837NnT12+fFmTJk2Su7u7hg8frp07dypRokSaMmWKtXvwnj17lDhxYm6p8RTePXglEX/c//jjD+XJk0f9+/e3BicPDw+dOXNGf/31l9KkSWP9MlmyZEmlTJlSV65csa6H0ISY4MkvqwsWLFDq1KlVtGhRNWzYUN9//738/f3VunVrlS1bVoUKFVL//v115MgRubq6WtdBaIq97ty5o/Pnz6tcuXLasmWLwsPDtXDhQi1btkyhoaGaO3euypQpo4ULF6pKlSpq2rSpLBaLRo0apaxZs6pnz56SxJdavDBvb2+5uLho06ZNSpgwoWbMmKHr168rYcKEWrhwoR4+fKiRI0cqWbJkyp49u5ycnDi+YoGpU6eqe/fuKlmypC5duqRixYrp8OHDypIli3Wev/76SxcvXpS7u7seP36s3bt3q1SpUmrXrp2k/30OFSpUyFG7EbM5tL0Lb6WI5t9Dhw6ZuHHjmp49e9o8HxISYipXrmxq1KhhDhw4YJ0eHBxs8ufPbx0qFYgJnuxi17VrV5MyZUozffp0c+vWLWOMMdeuXTOXL1+2WaZ8+fKRrlNB7Hb58mVTo0YNkzhxYjNmzBgzcOBA63MPHz40bdq0MW5ubmblypXGmH+veZo7d671Hl909cSzPKsL55gxY0zRokWNm5ub6datm/ntt9+MMcZ07tzZ5t5hz1sH3h0//PCDiRMnjlmyZIkJDQ01d+7cMblz5zZr1qyxub/g8uXLTcaMGU3evHlNgQIFTLZs2azdOPkcso+uenglJ0+eVO7cudWnTx/16NHDOn3VqlUqWbKk/P39NWrUKHl7e6tFixby8fHRnDlzNHPmTO3du1cZMmRwXPFAFIYNG6ZRo0Zp1apVypMnj1xcXCT9rzXqzp072rdvn77//ntduHBBhw4dUpw4cWhpiuWebK28cuWK2rVrp8WLF6tJkyaaNm2a9fh49OiRvvnmG82aNUszZ87UZ599Zl0HQ47jWZ48vmbNmqXDhw8rLCxMxYoVU+3atXX//n1dvXrVpjtVyZIllS9fPo0cOdJRZSOarV69WlWqVNGcOXNUr1496/SsWbMqW7ZsOnLkiKpWrar69esrR44cWrNmjX799VfFjx9fgwYNUpw4cfgcekG02eKlPXr0SP369ZOnp6eKFClinT548GBNnjxZGzZsULVq1RQeHq6ff/5Z1atX13vvvafQ0FCtX7+e0IQYJzg4WLt27VLHjh1VoEABXbhwQceOHdOUKVPk6+ur2rVry9PTU6NHj1a8ePF08OBBxYkTh64vsLkeKWXKlBo9erTc3d21cOFCtW7dWnnz5pUxRu7u7ho5cqTu3r2riRMn2gQnvqzgWSKOr2+//VY//vij6tatq9DQULVs2VI7duzQ999/r8yZMysoKEhHjx5V7969defOHQ0bNszBlSM6/fHHH/L19dWhQ4dUp04dubi4qGbNmnr06JGKFi2qLFmyaNy4cbp8+bJmzZqlatWq2QxDzt+yF0eLE17J5s2bNX78eOsH9O7du9WvXz/NnTtX5cuXt873+PFjnT9/XmFhYUqcOLGSJk3qwKqByIwxCgoKUpkyZZQtWzZ99NFHWrZsme7fv29tKciaNaumT5+uU6dOKVOmTFwvAJuWgO+++05nz57VmDFj5O7uritXrqh169baunWrNm/erFy5cllbnh4/fixnZ2cGgMAL27hxo1q0aKF58+apcOHCWrBggRo3bqyxY8eqadOmkqQVK1bop59+UlBQkJYtWyYXFxdaEGKR0NBQjRo1SsuWLVOhQoV0+vRpXbp0SYsXL5aPj4+kf+8z2LVrVx07dky+vr4OrvjtxV99vJJSpUrJ2dlZo0aNUr169fT3339ry5YtKly4sPXGnxaLRXHixLG5KBFwtKdHLbNYLPL09FTnzp3VvXt3rVmzRi1btlSZMmVUtGhRdenSRWfPnpUk67EcHh5OaIrFnjyGDh06pGvXrmnKlClKliyZevfurZQpU2rixIn66quv9PHHH2vz5s3KmTOnjDGRuoACT3v62Lh69apSpkypwoULa8mSJWrWrJlGjRqlpk2b6v79+zpy5IiqVKmi1KlT64MPPuDETiwT8feoU6dOCgsL09y5c3Xx4kVt375dPj4+evTokdzd3ZUlSxblzJnT+hmEV8O7Ci8t4sxp8eLF5eTkpKFDhypevHgKCgqSJOuwzBH/B2KKJ7+QbNq0SdevX1f8+PFVrFgx1apVSwULFpSzs7NSp05tXebPP/+M1L2UL7yx25Pdp5YtW6Zy5cqpaNGiGjJkiO7du6fhw4crZcqUmjRpktq2bavcuXNbWyufXgfwtCevacqbN6+8vLyUIUMGzZ8/X82aNdOIESPUsmVLSdL27du1atUqZc6c2ToUPid2YhcnJyfr7/zbb79VnDhxtGjRIk2dOlX9+/dXwoQJFRYWpilTpih9+vTKmDGjo0t+q9FVD6/kyQvit23bppEjRyowMFBdunRRhQoVIs0DONqTx2O3bt20ePFiGWOUMmVKubq6avHixUqQIIEkKSAgQLt379b48eN17tw5HT58mIEgYrmnf/cbNmxQrVq1tHbtWn344Yd69OiRFi1apCZNmqht27YaOnSoXF1d9c8//2jChAkaNGgQ3abwXE+e2Bk+fLgGDRqkffv26f79+/r4448VGBiocePGqU2bNpKkhw8fqkaNGkqZMqWmT5/OZ1MsF3H8hIaGavjw4VqxYoUKFCiggQMHqlGjRjpx4oT++OMP7hf3H/Gq4ZU82apUrFgxderUSV5eXho9erSWL19unQeIKSKOxxEjRmjOnDn68ccfdfr0aZUvX16bN2/WJ598ojt37kiSTp06paFDh8rJyck6el5YWBjHdCz1xRdf6M8//7SZFhAQoOTJkyt37tySJHd3d9WrV0/jxo3TmDFj5Ofnp9DQUKVJk0ZDhgyRs7OzQkNDHVE+3hIRX2SPHj2qhw8fasaMGXrvvfeUN29ezZ49W5J0/vx5rVy5Uv7+/qpataouX76sKVOm2PxNRuz0ZMtTly5dVK1aNR08eFBp0qTRsWPHrKEpNDSU0PQf8MrhpTz5wfzkB3Xx4sX1zTffKDQ0VDNmzLB22wMcadq0aTY3XL5w4YK2bdum8ePHq3Dhwlq7dq2GDh2qTp066fHjxypXrpzu3r2r/Pnza/LkyVq6dKn1Dw2tBbFXWFiYsmbNajMtVapUOnPmjPbv3y9JNieSvL291b9/f/Xt21fS/0I73adgz/bt25UzZ075+fkpLCzMOr1atWr66aeftHLlSjVr1kw9e/aUh4eH9u/fz4mdWCI8PPyZz0UcK0+Gp2+++UYff/yxKlSooKNHj1r/lvE59N/QVQ/PFNE15dy5c7p9+7Zy5coV5UWFT3Zh2bVrl9KmTas0adJEd7mAjf3796tgwYJq27atevXqpWTJkkmSli9frrx58+rq1auqWbOmevTooVatWql3794aPHiwUqVKpaNHj8rb21sSF/HHZk+PSjZp0iTlyJFDRYoUUWhoqBo2bKhr165pyJAh+vDDDyX9ey+ngQMHKn/+/GrRooVWr16tcuXKOWoXEMNF9fkyevRode7cWd26dVP//v1t/u7euHFDQUFBcnNzU4oUKWSxWPgyHAs8eZzMnj1bv//+uyQpT548atCgwTPnDw8Pl8Vi4Th5jfg2gGeyWCxasmSJihQpoipVqihXrlxatmxZpNakJ1ueihQpQmiCwxljlD9/fi1fvlyTJk3SwIEDrS1P1apVU9q0abVp0yYVLlxYDRs2lCSlT59en332mT7//HN5enpa10Voir2ebmUcNmyYGjdurIMHD8rd3V2tWrWSl5eXvvrqK02bNk2rVq1So0aNdPr0aVWqVEkZM2bU8ePHHVQ9YjpjjPXz5ccff9Thw4clSR07dtTgwYM1bNgwzZgxw2aZpEmTKkOGDEqZMqUsFgsDQcQSTw5I061bNz1+/Fj3799Xx44d1blz5yjnjzi+Ir6jcZy8HryKiJIxRleuXNHgwYPVq1cvFS9eXP3791fXrl1169Yt1alTx+bLJV0EEJOEhYUpPDxcVapU0aJFi/Tpp59Kknr16qXkyZNLki5duqT9+/fL1dVVoaGhWrNmjfLly6eePXta10H3vNgrqoFAzp07p/z586t+/fqaO3euSpUqpbhx42revHlq3769fHx8lChRIm3atElx4sSRl5eX4seP76A9QEz2ZAvCjRs31LBhQ1WtWlWDBg1Sjhw51L17d4WFhalNmzZycnJS8+bNo1wPJ3Zijw0bNmjRokVaunSpChcurPnz52vu3LnKli2bzXwRn11Pfn7xHe01MsATwsPDjTHGhIWFmQcPHpj27dub+/fvW59v2LChee+998y0adPMvXv3HFUm8Exr1641Xbp0MeXKlTN37941xhizcuVKY7FYTNu2bc2VK1eMMcZs377d5M6d26RNm9bkyZPHvP/+++bx48fGmP+9DxA7hYWFWf9/5swZc+HCBXPq1CljzL/HRu7cuU2WLFnM3r17rfNdunTJ3L592/q4S5cuJkOGDOb8+fPRVzjeOt26dTPt27c32bJlM66urubjjz82R48etT4/cOBA4+rqakaNGuXAKuEIEX+HIv6dOnWqKV68uDHGmMWLF5v48eObyZMnG2OMuXfvntm8ebND6oxtOFUBGxaLRatXr1adOnVUsmRJHTp0yGYkqFmzZqlw4cIaPXq0Zs+ezSAQiFFmzJihVq1aydvbW9WqVZO3t7eMMapcubJWrFhhHRb69u3bKly4sCZMmKAmTZqoVq1a+uOPP7jIGjbdp/r27avPP/9cxYsX15dffqkRI0bIYrHo0KFD8vT0VIMGDbRnzx6FhoYqVapUSpgwoXbu3Kk2bdpo1qxZWrJkidKnT+/gPUJM9f3332vKlCmqW7eu5s+fL39/fx09elStW7fW0aNHJf3bSt6hQwctWbKEUfNimYi/Qzdv3pQkJUqUSOnSpdOCBQvUsGFDDR8+3Ho/r23btmnZsmU2gyHhDXFwcEMMs2vXLuPs7GyaN29uihQpYhIkSGB69OhhcybVGGM+/fRTU6BAAesZfcDRlixZYuLFi2fmz59vMz0sLMzaghDR8tS6detIx7QxxoSGhkZLrYj5+vfvbxIlSmQ2btxojh8/br744gtjsVjMn3/+aYz59yxwvnz5TMKECa3TjDHmypUrZtKkSdYWKuBZGjVqZBo0aGAz7ezZsyZp0qSmfPny5o8//rBOj/gMozU8dpk6dar55ptvjDHG7N6928SPH99YLBYzYcIE6zwPHjww5cqVM02bNuX4iAa0OMHq5MmT2rx5s7777jtNmTJFO3fuVOPGjbVhwwZNmDBBAQEB1nmXLFmiZcuWWUceAxzFGKP79+9rxowZ6tixo2rXrm3zvJOTk3V0ocqVK2v58uWaOnWq2rVrp1u3btnMyzVNsVvEkL4BAQHauXOnZs6cqU8++USnT5/WmjVrNGnSJGXPnl0PHjyQxWLRvn37VK1aNfn6+lrXkSJFCrVo0UKZM2d21G4ghgsPD5cxRjdv3tTt27et04ODg+Xj46PevXtr/fr16tmzpy5evGh93nAD7ljn8uXL+uGHH3Tjxg0VKlRI06ZNkyT9888/WrNmjbZs2aKqVavqypUrmjx5MvfzigYEJ0iSzp49q5YtW2rs2LFyc3OzTh81apQ++ugjLVu2TBMmTLDeIFT69z4mgKNZLBYFBwdr7969ypEjR5TzmP/vfhUSEqIqVapozpw5On/+vBImTBjN1SImihjNLCI4BwcH69ChQ0qTJo3Wr1+vzz//XH5+fmrZsqWCg4M1btw47d27VxaLRTNnzpSzs7PNPXe4YB9Pevr+OxEjnTVt2lSbNm3SzJkzJcn6tzdBggRq2rSpdu/erT59+tgsg3eTMcYm8EQcM927d1e+fPnk5+enx48fq3bt2poxY4YWLVqkhg0bqlu3boobNy7384pGfLpDkpQuXTp9/PHHcnd31/Lly22uXRo1apRKlSql6dOna/r06ZzNQIwTHByse/fu2Xx5fZLFYtE///yjTz/9VAEBAapbt662bdtmbYlC7HX69GlVqFBBX331lXWal5eXypQpo4kTJ6p27doaOXKkWrVqJenf0Rh37Nihf/75x2Y9tFYiKk+Onrdy5UqNHTtWkyZN0vHjx1W9enW1aNFCAwcO1JQpUxQaGqrr169r/vz5KlSokKZOnaqFCxfqjz/+cPBe4E17ehS8J4cTL1q0qHbv3q2QkBBJUqNGjbRt2zbt2bNHS5Ys0fLly7lRezQiOMVST4efOHHiqEePHmrdurVu3ryprl27KjAw0Pr88OHDVbduXdWsWZOzGYhRjDFycXFR6tSptXLlSt24ccPmuQjnz5+33gTwyedoHYjdEiVKpC5dusjf31/t27eXJLm7uytHjhyaMWOGqlWrZr3B5N27d/X111/r/v37qlatmiPLxlviyfvvtG/fXkuXLtWvv/6qHDlyaO/everYsaO+/PJLtWvXTpkzZ1aBAgV04cIFNW7cWPHjx1eKFCmUJEkSB+8F3pQuXbpo+/bt1sfTp09XhQoVdObMGd2/f1/Ozs7q3LmzTp06JT8/P+t8yZMnV8aMGZUqVSru5xXNeJVjoYh+0jt37tSWLVsUGhqqnDlz6tNPP1WnTp0UHh6upUuXqnv37vLz85OXl5ckafDgwQ6uHIjMYrEoadKkat26tTp37qx8+fKpadOmSpgwoTXkP3z4UGPGjFHSpEmVKFEi63JAokSJ1KhRI7m4uGj06NEKDw/XuHHj1K1bN127dk1z5sxRjRo1FC9ePF29elX37t3Tvn375OzsbNOaADzLvHnz9OOPP2r58uUqWLCg5syZo+XLl+v06dMqWLCg+vXrp88//1y7d++2jgjq7OysNWvWKFmyZHJ3d3f0LuANOHHihHWEV+l/J/Pu3bunkiVL6pNPPtFnn32mSpUqqW/fvlq9erVOnDhhc01lBD6Hoo/F0O8qVlq8eLEaNWqkAgUK6OHDh9qzZ49atmypkSNHys3NTcOGDdPatWuVMWNGjR8/nps4IsaKOBEQHh6uNm3aaOrUqerQoYNq1KihvHnzateuXfLz89P169et/cC5yDp2O3PmjJycnOTj42OdduPGDf3yyy8aMWKEKleurAkTJkiSZs6cqZMnT+rmzZvKnj27vv76a8WJE0ehoaGc4cVzRQTr/v3769atWxo7dqyWLFmihg0batSoUWrevLnu3bunu3fvKm3atNblTp48qe+//17z5s3T1q1blStXLgfuBaLDzz//rMSJE6ts2bKSpGnTpmnnzp2aM2eOWrVqJScnJ/36668aMmSIatSo4eBqY7loHsUPMcDZs2dNunTpzKRJk4wx/w5zunbtWuPh4WFat25tjDEmJCTE9OrVy5QpU8Z6w1DA0Z68MWlUAgICTJ8+fUzcuHGNi4uLcXd3N9mzZzeVKlUyISEhxhiGHI/tFi9ebCwWi0mZMqWpV6+eGT9+vPn777+tz48dO9a89957pmXLls9cB8cQniUsLCzS8dGzZ0/TunVrs2TJEuPp6Wn922uMMbNnzza9evUyQUFBxhhjgoODzc8//2zq1atnMxw53k3h4eHmypUrJnfu3KZs2bJmxYoV1ufCwsLMpk2bTM2aNc0nn3xiLBaLqV69ugOrhTHG0OL0jps6dapy5MihwoULW8+w//nnn6pevbpWrlyp999/33pWbPXq1apatapWrVqlChUqKCwsTHfv3lXixIkdvBeArTFjxihz5syqXLlylM8fPHhQt27d0s2bN5UjRw5lz55dTk5OtBJA3333nQYMGKAcOXIoNDRU3t7e2rt3rwoVKqSKFSsqS5Ys+uuvvzRlyhTVqlWLLsp4YStXrtSSJUt0+fJllS9fXh07dpQkzZ49W35+fvrnn380dOhQtW3bVtK/w95//vnnyp07t831KyEhIXr8+LHixYvnkP1A9Nu7d6969OghNzc3tWrVSlWqVLE+d/v2bd24cUNz585V79695eLi4sBKQXB6hxljlDZtWsWPH18//vij8uXLJ4vFoqNHjypnzpxat26dypYtq7CwMDk5OenBgwcqXLiwWrVqpTZt2ji6fMDqyWtJpkyZon79+mnFihXKnz+/zXzmOV3wuB4FEfz8/PTrr7+qQIECatOmjc6cOaPt27dr9uzZ8vLy0t9//y13d3ddvXpV06ZNU5MmTRxdMmK4KVOmqFu3bqpevbpu3Lih1atXa9CgQerRo4ckqV69etZ7yOXPn1/BwcH65ptvdP36de3Zs4cuxLHEk3+Hnv6btGfPHnXr1k0eHh5q3bq1KlWqFOV8jx8/Jjw5EMHpHRXxARwSEqJChQopNDRU06dPV968eRUnThx9+eWXOn/+vEaPHq2CBQtK+vfNWaRIETVq1MhmaF4gpjhw4IBmz56tAgUKqH79+o4uB2+ZJ7+A9OvXT8uXL1f58uX1zTffKHHixLp3756uXLmiBQsW6MiRI7p69ar8/f1ppcRzTZs2TW3bttXPP/+sTz/9VNeuXVOlSpV09+5dbd261XrPwypVqujcuXP666+/lC9fPrm5uWnDhg1ycXFRWFgYQ0m/4578/Jk8ebIOHz6swMBA1apVS2XKlFH8+PGt4SlevHhq3bq1Klas6OCq8TSC0zssODhYbm5uun//vvLkyaN06dLJz89PhQoV0ubNmzVy5Ehdv35dPXv2VLJkybR8+XJNmzZNe/fuVcaMGR1dPmBjx44dKl26tJydnfX999+radOmji4Jb6Env7wMHDhQS5YsUbly5dSmTRubC/SfRBdPPMuxY8eUM2dONW7cWNOmTbNOz5Mnj65du6Zt27bp8ePHev/99yVJFy5c0LFjx5QmTRply5aNLsSxULdu3TR9+nQ1adJEJ0+e1OXLl1WiRAn16tVL3t7e2rNnj3r06KGgoCCNHj1aRYoUcXTJeALv1HeUMUZubm5asGCBNm/erLRp02rLli366quvNH36dJUqVUpOTk6aNWuWatWqpcyZM8vJyUkbNmwgNCFGKlq0qIYOHaqePXvK399fpUuXVvr06R1dFmKwqM7iR9z02MnJSb1795YxRsuWLZPFYlG7du2UMmVKm/mNMXypxTPFixdPnTp10owZM1SyZEnVq1dPNWvW1KVLl1S8eHF16dJFBw8eVP78+VWqVCmVLl1a5cuXty7P/XfebU93s5s1a5YWLlyo9evXK2/evFq5cqWqV6+uBw8eKDg4WIMGDVKhQoXUr18/LViwQIUKFXJg9YgKLU7vsG3btqlcuXIaN26ccuTIocePH6tZs2ZydnbWTz/9pA8++ECSdPbsWcWJE0fx4sVjIAjECM+7HmnYsGH6/vvv1bJlSzVv3tzaDQZ4UkSLuyTdunUr0mfb0y1PK1asUIECBTRw4EA+B/FSLl++rLFjx2rixIlKly6dPDw8NHfuXGXJkkW3b9/W33//rZEjR2rHjh3y9fXV2rVrHV0yosnly5eVKlUqhYeHS/r3BreXL19W3759tWzZMjVp0kT9+vXTP//8o+nTp6tRo0bq1auXEiZMaF0H1+fGLASnd9ioUaO0cOFCbd261XohYWBgoAoUKCBPT09NnDhR+fLl42wXYpQn/0hMnz5d+/btk4uLi3x9fa2DlgwaNEg//PCDmjdvrmbNmhGeYGPDhg3au3evevbsqa+++krHjx+3XkvypCePtS5duujmzZuaMWMGF+jjpV2+fFmTJ0/WqFGj1LNnT3Xv3l3S/y7kDw0N1YMHD+Tp6cmX4Fji8OHDyps3rxYuXKiaNWtK+nckxYcPHyo8PFwVK1ZU/fr11blzZ126dEkFChRQnDhx9PXXX6tLly4MFhJD8Y35HRTxZgsICNDdu3etXxYePnwoLy8vjR07VhUqVFCLFi00c+ZM5c2b18EVA/8T8aWia9eumjFjhqpVq6bTp09r+fLlWr16tdasWaNevXrJyclJU6ZMUWBgoLp166YkSZI4uHLEBOHh4VqyZIn27NmjDRs26MiRI9qxY0eUo1A92W1v+PDh1s9OvrDgZaVKlUrNmzdXaGio/Pz8lCxZMjVt2tQamuLEiSMvLy9JUXchxbsnZcqUatGihb744gstWLBA1apVU/z48eXt7a1t27YpMDBQFSpUkCRdv35dH330kcqUKWO9fpfPoJiJ0x7voIg3W+3atXXp0iXr/SHixo0rSXJ1dVWVKlXk5uamBAkSOKpM4Jl2796tefPmadGiRZo2bZrWrFmjadOm6ciRI9Yzdz169FD9+vV15swZulbBysnJSZMmTZK7u7u2bt2q+vXry9fXV9K/J5Wimj9iOqEJz2Ovg07atGnVtm1btW3b1nrdk6RIvToITbFD8uTJ1b9/f7Vq1Uqffvqpli9fbtPaGDduXK1cuVInTpxQnz59FC9ePDVr1kxOTk4KCwtzYOV4HoLTOyDiw/zw4cOaO3euDhw4oFu3bin7/7V353E15f8Dx1/tixZCKhPCjH1J9pgxwzBjy04xQsa+RVSyzVgbQoaJiLKksSQpJku2KXsyxjrMGDRSpMjSen9/+HWmS5aZ+VLxfj4ePcb9nHPu+dxzz5x73ufz+bw/tWrh7u7OqlWrlEkc09PT2bt3LzY2NsTGxkoiCFEk5PX/zvvvX3/9RU5ODvXq1QOeBvuffvopixYt4ty5c/z888/A31nR8m54xfsr79yBp+ObateuTZ8+fTh69Chz5szhwYMHaGhoFHhDkj9QkqBJFCQ3N1c5Nx4/fgwUHEhZWVkpwdPgwYOJiIh4q/UUhevmzZvcvXtXeV2uXDk8PT0ZOXKkEjzB06yLLVq0YNWqVXz22WckJSXh7++v/JZJcF10SVe9d4CGhgahoaEMHDiQsmXLcu/ePZycnHB1dWXs2LFoaWkxZ84cVq1ahZGRETdv3iQ6OlrGNokiITU1VWn5PH78OE2bNqV69epoaWlx4MABunTpAoCOjg4NGjTg9u3bJCUlKdtLK4HIP1Zp3bp11KlTB39/fwBGjx7Ntm3b0NDQYNSoURgbGwOQmJiIhYVFodVZFB/5z6/vvvuOM2fOsGTJkhe2dFtZWTFs2DAqVKiglkFPvNu2bt2qjLn9+uuvKVeuHI6OjlhYWODj44OmpiZdu3Zl06ZN9OjRAx8fH65evcr9+/dp3rw5Wlpakpq+GJAWp2Is72nXjRs3CAwMZMGCBfzyyy/MnDmTU6dOMW3aNG7fvo2HhwenT59mzJgxuLq6cuLECSWjnhCFaceOHYwfP56kpCTGjBmDvb09KSkpmJmZUb16dYKDgzly5IiyvqmpKZUqVXruh0WCpveXSqVSbmo9PDyYMmUK4eHhJCcnA+Dr60vjxo0JCwvDx8eH69ev07p1a5nkW7y2/OMuFy9eTPPmzbl3795Lt7G2tmbo0KFoa2uTnZ39NqopClFmZibR0dFkZ2dz584dtm3bhoeHB3Xq1KF79+4cPnyYLl26MHnyZHr37k1UVBRGRkbUq1ePli1boqWlRU5OjgRNxYBk1SvmTpw4wdq1a0lISMDf318ZIL927VqWL1+OjY0N7u7u1K1bt5BrKsTzwsLCGDJkCFZWVty8eZNDhw5Rs2ZN4OmEtyNHjsTS0hJ7e3vq1avHkiVLuHPnDidPnpSuDEKNt7c3CxYs4KeffqJBgwZoaGgoLQUqlQpPT0927tzJvXv3sLS05Oeff0ZXV7ewqy2KsPwtTdHR0QwYMID169fz8ccfF3LNRFF0+/Zt5s6dyx9//EGtWrVwdXVl27Zt/PTTT5w5c4YnT55QtWpVYmNjycnJ4cSJE9jZ2RV2tcU/JC1OxdyePXv48ccfOXr0KKmpqUp5//79GTZsGAkJCUyZMoXz588XXiWFeEbe85ouXbrQpk0bzp49S6tWrTAyMlLWsbe3x9/fn0qVKuHv78+3336Lrq4ux48fV57OCQFPp1mIjY3F29sbOzs7rl27RkREBA4ODri5uZGcnMy8efMICAggICCAI0eOoKurKy0BokAeHh4AagP5//zzT8qUKaM2Iemzz53zj7MT759y5coxadIkrK2t2bNnD5s2bWLIkCGEhoYSGRnJhg0bsLGxwc7OjipVqihjeEXxIi1O74Bly5axcOFC2rVrh7u7OxUrVlSWrVy5ktDQUAICAmSuG1EkPDuZ36pVq3j48KFyDo8bN46aNWsq45ZycnJ4/PgxDx8+xNzcHA0NDekHLtSoVCpatGiBkZER48ePZ8mSJdy/fx9ra2t27NiBo6OjMuYpj6SEFgU5ePAg3t7ehIeHq11jgoKCmD59OgcOHKBSpUrA0/MuNzeXjRs38vnnn1OuXLlCqrUoSm7dusWcOXM4fvw4Dg4OTJ48WVn27JQH8ltW/EiLUzGSF+M+evSI9PR0pXzkyJEMGTKEo0eP4uvry/Xr15VlX3/9NSEhIRI0iSIhf9C0YMECPD09cXZ2ZuzYsSxevJhdu3axePFiLl68qIxb2rt3L0ZGRpQrV075wZEfmvfXs0/187KdzZgxg6SkJHr16oWtrS1z5swhODiYqVOnkpSURGZmptp2EjSJgjRr1ozIyEi0tbXZvHmzUl6xYkUyMjIICQlRsqbl3fiuXLmSwMDAQqqxKGosLS3x8vKicePGhIeH4+3trSzL6ymR15VYfsuKH/nGiom8pxORkZGsWrWKX3/9lW7duvHJJ5/Qvn173N3dyc3NZfPmzWhrazNixAjlqZipqWnhVl6I/5cXNE2aNIng4GBGjx7N9evXqVKlCl27dkVDQ4Nx48aRlZVF586dCQgIIC4ujoSEBODpj40kgnh/5Q+8/f39OXr0KI8ePaJly5aMHDmSEydOcOvWLaytrZVtoqKiqFGjhoxnEq+Uk5OjnCeXL19mwIABBAUFERERQatWrRgyZAhz5szh3r17tGjRAhMTE2bPns2DBw+YMGFCIddeFCUWFhZ4eXkxZ84cwsPDefDgAbNmzVILlPL3vBDFh3TVK0bCw8NxdHRk/PjxfPDBB2zZsoX09HRGjx6Nk5MT8DRVqp+fH3379mXGjBnyNEMUOREREQwZMoStW7fSrFkzALV04hEREcyYMYOsrCxKlizJ3r170dHRkZTjQuHu7s769etxcnLC3Nwcd3d3xowZg4+PD1paWjx8+JDY2FgWLlxIQkICcXFxaGtryzkkXujOnTtKcqXo6Gg+++wztm7diqenJ9WqVWPHjh0A+Pj4EBYWxokTJ6hZsyalS5dm586d6OjoSPdP8ZzExEQmTZqEvr4+K1askOvPO0ACp2Li0qVL9OjRg1GjRjF06FAeP35MxYoVMTMzo2TJkri6utK7d28AFi1aRJcuXbCxsSnkWgvxPF9fX7Zv3050dLRyI/vsuKdr166RnZ1N5cqV0dTUlH7gQvHzzz/j7OxMYGAgLVu2JCoqis6dO7Ns2TIGDx4MwOHDh1m9ejV3795l69at6OjoyDkkXigyMpKAgAB8fHzw9fVlyZIlpKSkoKenx65du3Bzc6NWrVpK8JSUlERaWho6OjpUrFhRxqqIl0pJSaFkyZJKhk8Jnoo3+b+8iHnR/1QGBgZ06NCBnj17cvPmTT755BN69uyJi4sLPXr0wNvbm/T0dFxcXHB1dS2Emgvxep48eUJCQoIy8W3ePDxZWVls27YNBwcHpZspIP3A33PPBtUpKSmUK1eOli1bsm3bNvr378+SJUsYPHgwaWlpnDt3jpYtW2JhYUGVKlUk8BavZGZmxvHjx+nQoQO3b9/ml19+USblbt++PQBubm44ODiwfft2zM3NMTc3V7aXa5R4GTMzM+D5a5konuQbLELyBjnfvXuX8+fPc/bsWWVZ+fLlmTBhAmZmZsycOZOmTZsyb948GjRoQNOmTUlOTiY8PJy0tLTnUqQKURhelJq3Vq1apKWlERYWxoMHD5QHBZmZmSxZsoSgoCC19eWH5v2W9/37+voSHR2Nubk52traLFu2DGdnZ+bPn8/QoUMBOH78OPPnz+f69et8+OGHaGpqyk2teKG8rHjNmjWjQ4cOXL58mUaNGql1t9PX16dDhw4sWLCA8+fPFziHk1yjxOuQ8+TdIL8mRUTek4hff/2VQYMGkZycjEqlom3btvj7+6OlpUXZsmWBp932GjZsiLGxMQDGxsZMmDABR0dHSQQhioT8T9ZCQkK4desWSUlJDB48mI4dO9KjRw/c3d25c+cOLVu2RFtbGy8vLzIyMhg0aFAh114UBfnPoRUrVuDt7c327dsxMTFBpVIxYcIEJk+ezLBhw4CnLZm+vr6UKlVKLTmE3KyIguSdX3kPbtq2bcvHH3/MjBkzmDFjBhMnTqRhw4YA6Onp0b59ezIyMti0aZO0HAjxHpMxTkVA3kX4zJkz2NvbM2zYMDp27MiWLVtYuXIlixcvZvjw4eTk5JCRkcGwYcO4d+8enTp14urVq6xbt44TJ05Qvnz5wv4oQqiZNGkS69evp02bNly8eJGUlBQ8PT1xcXFh/PjxHDp0iLi4OOrVq4eJiYmSCEIGWYs8cXFxrFmzhiZNmtCvXz/gaTDu5uZG69at+fzzzzE0NMTPz4/bt28riSDk5la8SP5z4/vvvyc1NRVXV1eMjIyIiYmhf//+NGzYEHd3dxo0aADA9u3bcXBwKPA9hBDvD2lxKgI0NTW5cuUKTZs2xc3NjZkzZwJP541YuXIlV69eBZ7OO2JoaEi/fv1YtGgR3333Hfr6+kRGRkrQJIqE+Ph4KlasSKlSpdi0aRMbN25k165d1KtXj127dtGhQwdl7MDChQu5ffs2165dw8jIiBo1ash4FKHm8OHDtGvXDm1tbezs7JTyPn36kJGRwfbt2xk+fDh2dnaYm5uzc+dOtLW1JfAWL5Q3phJg4sSJanN9GRkZYW9vT2BgIIMGDWLWrFl07tyZrVu3EhsbS3JysrKtBE1CvJ/k7qQIyM3NZfXq1RgbG1O6dGmlPCQkhKysLH777TcWL16MmZkZvXr1om3btnz66aekpKSgpaWlpFAVojDFx8fzxRdfsH37dpo0acKNGzdo3rw59erVY+PGjQwbNoxly5bRvXt37t+/T0pKChUrVqRcuXLKe8h4FJFfy5YtmTVrFlOnTmXfvn20bt1a6Ybn7OyMo6Mjd+7cwdTUFENDQ8luJl7oyZMn6OvrK13z1qxZw/r16wkPD6dRo0bA06DqwYMHtGzZkg0bNuDm5sayZcswMTEhMTFRsqIJISRwKgo0NTUZNWoUjx49IiQkBD09PR48eMD8+fPx8vKifv36bNiwgRs3bjB58mSqVavGuHHj6NSpU2FXXQhF/fr1MTU1xdfXl+DgYO7evYuBgQGnTp1i6NCheHt7M3z4cODpQ4GkpCTc3NzQ19dX3kOe4r6/XtT1afz48WRkZLB06VKCgoJwcXHB0tISAB0dHaysrJR1VSqVBE3iOY6OjvTp0wcHBwcl8Dlz5gxt27alUaNGnD9/nsOHD+Pv709aWhrz5s2jR48ebNmyhczMTKysrKQ1XAgBSOBUZFhZWeHh4cHs2bPx9fXl6tWrREVF8dlnnwHg4OCAtrY2S5cuJS4ujipVqhRyjYX4W17XKDc3NxYvXsyVK1fo3r07bdq0Ye3ataxbt46+ffsC8PjxY8LCwqhSpYpa0CTeX/mDph07dpCQkICJiQktWrSgQoUKeHp6kpWVpUwg6eLigoWFxXNP/qUlQBTExsaGL7/8EoCsrCx0dXWxtrZm48aNuLm5ER0djY2NDR07duT27du4uLjw6aefSspxIcRz5CpQhFhYWDBlyhQ0NTU5cOAAp0+fVgKnvNTOo0aNkqdeosjJG0/SqlUrvLy82LJlCx4eHri5ueHn58f169eV8UzffPMNf/31F+Hh4cCL5y4T74f8Y048PDwIDAykZs2aXLhwAXt7ewYMGEDHjh2ZNm0aACtXruTBgwdMnDhRrWuzEM/KC8jnzJkDgJ+fHyqVikGDBtGtWzdSU1MJDw/HxcWFtm3bUr16dQ4dOsSFCxeem05BWsOFECCBU5FTrlw5PD09yc3NZfPmzWRnZ+Pu7o6urq4SMEnQJIqavJuMDz/8kPHjx/PDDz/g6OjIgAED0NDQYP78+SxcuBArKyssLCw4ceKEDOIXwN+tRIsXLyY4OJjw8HAaN27M0qVLGTduHA8ePCA7O5suXbowbdo07t+/z6VLl5RJJYV4kbxzK+/hTGRkJBcuXMDIyIg+ffowc+ZM3N3dMTIyAiA7O5u5c+diYmIiY4eFEAWSdORFVGJiIrNnz+b06dO0bt2ab775prCrJIRix44duLu7M3nyZFq0aEGlSpWUZYcPH2bw4MFMnz4dJycnsrKySE1N5eLFi5ibmysTk0rLqciTlpbG5MmTqVu3LkOHDiU0NBQXFxeGDRtGREQExsbGeHh40LlzZ+DvG2FprRQvkv/cuHHjhpJU5KuvvuL48eN4eHjQs2dPjIyMSE9PZ/fu3SxdupSUlBROnDiBjo6OpBwXQjxHAqciLDExEU9PT27evElISIh0SxFFgkql4tChQ8yZM4dr167x8OFDxo0bR6tWrZQJI/v378/Ro0e5fPlyge8hNyQiv5ycHOLj47G2tiYpKQkHBwfGjBnD2LFj2bhxI0OGDKFWrVrMmTNH6b4sQZN4kfzXl+DgYH788UcmTZqEvb09AE5OTsTFxeHu7k7v3r1JTk4mMDCQv/76i2XLlqGtrS0PdoQQBZLAqYi7ffs2gFrKZiGKitjYWPbu3cvy5cspWbIkdnZ2eHl5cefOHTw9Pfn666/p379/YVdTFCHPBs15r/MCoaVLl7Jp0yYiIiIwMTEhKCiITZs2Ub16debPny8Bt3ip/OdXTEwMK1asIDIykjZt2jBhwgQaN24MPA2e4uPj8fDwwNHRkczMTCWlvXQhFkK8iPwCFXHlypWToEkUOTk5OQA0b96cadOmsXfvXsaNG8fRo0fp1q0bbm5uXLp0iYMHDxZyTUVRkv+mdtmyZYwaNYrPPvuM0NBQfv/9d+DpfDsPHz7k4sWLZGZmEhoaSrt27fDx8UFTU/O5QftC5Jd3fo0fPx5nZ2fKli1L+/bt2bVrFwsXLiQmJgZ42hLVsGFDxowZw549eyhRooTS/VOCJiHEi0iLkxDilV63W1Rubi4BAQEcP36cgIAA6tevz6lTp6RLlVDj7u5OUFAQQ4YMIT09ncDAQBwdHfH19eXUqVMMHDiQ7OxssrKyMDIyIi4uDh0dHemeJ15LTEwM3bp1Y9u2bTRv3hyAzZs3M2vWLD766CMmTpyotDx98803TJkyRYIlIcRrkcBJCPHaEhMTsbCwKHDZs91bYmNjadKkCVpaWnLDK5RzYP/+/bi4uLBlyxYaNGjAiRMnaNKkCevXr8fJyQmA+Ph44uPjefToEUOGDJExJ+IfOXbsGF26dCEiIgI7OzulPCQkhL59+9KzZ09Gjx6tjHmC569fQghREOmqJ4R4odDQUI4fPw7ApEmT8PLyIiMjo8B182468p7FNG/eHC0tLbKzsyVoeo89fPgQ+Ds19JMnT7C2tqZBgwZs3LiR1q1bs2zZMpycnLh//z7Hjh2jfv36DBgwgBEjRihp6yVoEgXJu948+ww4OzubhIQE4OmktwC9e/emevXq/Prrr6xdu1ZZDkjQJIR4LRI4CSEK9PjxYzZu3EizZs3o27cvP/zwA2PHjkVPT++l2z0bJMkN7/srLCyMkSNHcuXKFaXs3r17pKSksHPnToYPH868efMYPnw4APv27WP58uXcunVL7X3kplYUJDc3V7neZGdnK+VNmjShc+fODBgwgNOnT6OjowPA3bt3adiwIQMGDODHH3/k1KlThVJvIUTxJV31hBDPyetWlZOTQ/Xq1bl27RqBgYH07dtXukyJ1xYZGUmXLl0YPHgwEyZMoGrVqmRkZNCqVSuOHTvGkiVLGDVqFAAZGRn06NEDU1NT1q1bJ62U4qXyJxpZsmQJBw8eRKVSUalSJRYuXEhmZiZOTk7s2rULT09PTExMCA8PJysri4MHD2JnZ0fjxo3x8/Mr5E8ihChOpMVJCKEm/3ikkJAQ9PT0aNOmDcOHD+fIkSNoa2tLZjPxQrm5uahUKnJzc+nQoQORkZGEhITg7e3NlStX0NPTw8PDg/r167N582YOHTpEcHAwXbp0UQL0vOxmQrxIXtDk6enJzJkz+eijjzAzM2PLli00atSI1NRUtmzZwtixY4mMjCQgIABDQ0OioqIA0NPTo1q1aoX5EYQQxZC0OAkhFPmf4k6dOpXt27cTHBxMxYoVGTJkCBEREezZs4emTZsq21y/fp0KFSoUVpVFEZORkfFcd85du3bh5OREt27d+Oabb7C0tGT37t3Mnz+fs2fPUqVKFWxsbFi7di06OjoyUF+8lvPnz9OxY0f8/Pxo164dAL///jvdunXDwMCAI0eOAJCamoq+vj76+vrA02vb6tWrOXjwIFWrVi20+gshih9pcRJCKPKCpmvXrnH58mUWLFhA7dq1MTY2xtfXl06dOvHFF19w6NAhHj9+TO/evVm0aFEh11oUFRs2bKBhw4YsXbqUbdu2AZCZmcmXX35JSEgIoaGhTJkyhYSEBL788kuio6M5duwY+/btIzg4GB0dHbKzsyVoEq8lNTWVtLQ0atSoATxtLa9cuTJBQUFcv36d4OBgAIyNjdHX1+fy5csMHTqUlStXEhERIUGTEOIfk8BJCKHGz8+PRo0acfnyZbWWJHNzcxYvXkyXLl1o1aoVzZs35/Tp03z33XeFWFtRVNy7dw9fX1/OnTvH+vXrcXV1xdbWFicnJ/bu3Uvz5s2JiooiPDwcHx8fzp8/D0DlypXVJh+V8XPiddWoUQMDAwNCQ0OBvxPTfPDBBxgYGHD//n3g7+Qi5ubm9OzZk9jYWGxtbQun0kKIYk0CJyGEGmdnZ6ytrTlz5gznzp1TG89kbm5OYGAgW7duZezYsVy4cEFpJRDvN1NTU5YsWYK9vT3p6ekcOHCAwYMHk5WVxcCBA6lSpQqhoaHUrVuX1atXM3/+fG7evKn2HpIQQrxM/muRSqVCT0+PTp06sWPHDn788UdlmaGhISVLllSy6eWNSChZsiRt2rShcuXKb7fiQoh3hoxxEuI9ln9MU35PnjxRJo5cu3at8u+CJrKV8Sgij0ql4tSpU/Ts2ZPq1auzfft2dHV1OXfuHNeuXWPt2rWkpqayZ88e7O3tOXjwYIHnnxB59u3bx5EjR5gyZQrw/DXrwoULeHl5cf36dWxtbbGzs2PTpk3cuXOH06dPy7VJCPE/JYGTEO+p/Dcg+/bt48aNG1SoUAELCwtq1qzJo0ePqF+/PiVKlCAgIIAGDRoABQdP4v305MkTZcB9fidPnqRXr15YWFhw6NAhpftddnY2mpqa7N27l9atW6OlpfXC4F2IjIwMxowZw5EjR/jqq6+YOHEi8Pe1K+9adOXKFcLCwli/fj2mpqZYWlqybt06STQihPifk8BJiPfcxIkT2bBhAyYmJjx+/JhSpUoxefJkevXqxaNHj2jQoAFGRkYsW7aMJk2aFHZ1RRGxfv16kpKSGD9+vNIVSqVSKUHQ6dOn6dGjB5aWluzfvx8dHR0yMzPR1dVV3kNuasWr/PXXX3z33XccPXqUrl274u7uDvw9+W3+CXDzzqX8ZTJmTgjxvySP+YR4j23YsIHAwEA2bdrEL7/8wo8//kjz5s2ZMGEC27Ztw9DQkNOnT/P777+zfPnywq6uKAJUKhXZ2dn4+PhgaGiolMHTrIx79uxhx44d2NrasmnTJm7fvk2bNm3IyspSC5oACZrEK1lZWeHh4UGjRo3Ytm0b3t7eAEqLE8Dt27dxdnYmJCRECZok0YgQ4k2QwEmI99jZs2ext7enRYsW6Orq0rRpU8aNG8cnn3yijEcxMDAgMTGRVatWFXZ1RRGgoaFBdnY2qampynxNeU/+t23bRvfu3Xn06BEAdnZ2hISEEBcXx9ixYwuz2qIYs7CwwMvLSwme5s2bBzwNnm7dukX37t05ceIEPXv2VLaR7sRCiDdBAich3mPGxsb8+eefpKSkKGUfffQRn376qTJXE4Curi5aWlrk5OQUVlVFEWNsbEy5cuWApzepu3fvxsnJifnz59O7d29lPTs7O06ePMn3339fWFUV74D8wVNYWBjz58/n7t279O3bl3v37nHu3Dm0tbXlGiWEeKMkcBLiPZA/jW9+NWvWJCUlhe3bt/PgwQOlvHr16lhbW5ORkaG2vnSten/t27ePWbNmAaCjo8PDhw8xNjZWlpcpU4Y1a9YwdOhQpSyvK1W1atUk8Bb/WV7w1LhxY7Zu3UqVKlVITEwkPj5eJk8WQrwV0gFYiHdc/qxlYWFhpKenk5OTw1dffUXXrl05dOgQHh4epKWl8fHHH1OmTBm+/fZbSpcuTcWKFQu59qIoyMjIYNOmTRw9epQSJUrg4uJCRkYGWVlZyjoNGjRQMi/meba7lNzUiv/KwsKCyZMn4+7ujpmZGdu3b1eCJhnTJIR40ySrnhDvsPypw11dXQkMDMTKyoqEhARsbGxYsmQJLVu2xMPDg59++omLFy9SrVo19PT0iImJQUdHR9JFC+Dv7GbHjh2jefPm7Nixg759+2JsbExubq4y3ikjI4Nbt27Ru3dvGjduXMi1Fu+qe/fuYWpqiqampgRNQoi3RgInId4DN2/epHv37qxYsUJpRercuTP37t1jw4YN1KtXj4sXL5KYmIiWlhbNmzdHS0tLbkiEmlu3bjF79mwOHDjA+fPnqVKlCsbGxjx8+FBJD62vr4+ZmRl79+6Vc0e8cfJgRwjxNkngJMQ7btGiRURERGBqasqGDRvQ09NDU1OTnJwcGjduTMmSJdm3b99z28kcO6IgiYmJzJ07l1OnTtGqVStl3FNmZiba2tpqE5PKOSSEEOJdIo9phHiHPXnyhMzMTM6fP8/ly5cxMDBAU1OTR48eoaWlxcKFC4mPj+fixYs8+wxFbnhFQSwsLPDw8MDW1pbdu3czd+5c4GnmxbzkDxoaGqhUKjmHhBBCvFMkcBLiHfJs9jx9fX2cnZ3x8vLi8uXLuLm5ASgTl2ZlZWFiYoKenp7MeyJem6WlJV5eXjRt2pSIiAimTJkCPM22l0fOJyGEEO8a6YAuxDsif1//S5cukZWVRbVq1bCwsGDw4MFkZWXh4eFBZmYmX3/9NZqamixcuJDy5ctL9jzxj+VlN5s0aRJJSUlqiUiEEEKId5GMcRLiHePp6UlQUBDZ2dno6OgwceJEnJycMDMz4/vvv2fKlClkZWUxbNgwEhMTCQoKwsDAQAZZi38lJSWFkiVLqo1tEkIIId5F0uIkRDGXP+AJDw9nzZo1+Pv7U6FCBYKDg1mxYgWJiYl4eHgwePBgdHR0mDt3LlpaWmzatAl4OhZKX1+/MD+GKKbMzMwAyW4mhBDi3SeBkxDFXN7N6po1a3jy5Alubm507twZgPr162NhYcGiRYto3Lgx3bp1o1evXuTm5jJjxgyMjY359ttvJWgS/5kETUIIId510lVPiHfAnTt3aNKkCX/88QcjRoxg6dKlanMw9ezZk4SEBGJjYwGU+ZvGjBnDt99+qwzuF0IIIYQQBZMWJyGKudzcXMqUKcO2bdsYN24cO3fuJCEhgfLlyytjTurWrUtaWprSnapUqVI4OTmho6NDq1atCvsjCCGEEEIUedLiJEQxNmfOHDIyMvDy8kJXV5dz587h5OREbm4uW7dupWzZshgYGNC2bVssLCyUMU15ZFyKEEIIIcTrkRYnIYoxHR0dpkyZgpGREWPHjqVWrVoEBwfTr18/mjZtio2NDXXq1CE1NZV9+/YBqGU+k6BJCCGEEOL1SIuTEMXEi1qHfvjhB0aNGsXcuXNxdXVFV1eXX3/9FVdXV44dO0ZMTAx16tQBUBv3JIQQQgghXp8ETkIUM+fPn6dmzZpqZUuXLmXMmDHMnTuXcePGoaenx6+//oqTkxOamprExsZiaGgoXfOEEEIIIf4luYMSoojLyMhQ/h0dHU3t2rXZsGGD2jqjRo3C29ubqVOnsmrVKh4/fkzt2rXZuHEjWlpa1KhRg/T0dAmahBBCCCH+JbmLEqII2717N0uWLOH48eMAfPbZZ0yYMIGvv/6a4OBgtXU7deqEgYEBo0ePZuvWrQDUqlWL1atXY21tTVJS0luvvxBCCCHEu0IGOwhRRK1Zs4apU6fSuXNntZTh8+fPR1NTkwEDBgDg5OQEgJ6eHqNGjaJ+/fp07dpVWb9evXpER0ejq6v7NqsvhBBCCPFOkcBJiCIoJCSEUaNGsWbNGr744gtMTEzUlnt7e5OTk8NXX33Fb7/9Rq1atVi7di0qlYrZs2cD6okgJGgSQgghhPhvJDmEEEVMcnIyvXr1okePHowcOVIpT09P5/z58+Tk5NCsWTMAvvvuO77//nuMjIwwNzdn79696OjoFFbVhRBCCCHeWdLiJEQRlJSURPny5ZXXfn5+REdHs3XrViwtLalcuTKHDh1i0qRJ9O7dGx0dHSwsLNDU1JSU40IIIYQQb4AkhxCiCLp//z6RkZFER0fTo0cP/Pz8KFu2LFFRUfj6+vLXX38xc+ZMACpUqICVlRWamprk5uZK0CSEEEII8QbIHZYQRUzZsmUJDAyke/fuREdHY2xszOLFi6lXrx6lS5fm3r17mJiYkJubC4CGhoayraQbF0IIIYR4MyRwEqIIat26Nb/99hvp6enY2Ng8t9zY2BgrK6tCqJkQQgghxPtJkkMIUYwkJyczcOBA7ty5Q0xMDFpaWoVdJSGEEEKI94K0OAlRDNy5c4dVq1bx888/k5SUpARNOTk5EjwJIYQQQrwFMiBCiGLg5s2bxMTEULVqVWJjY9HR0SE7O1uCJiGEEEKIt0S66glRTKSmpmJqaoqGhoa0NAkhhBBCvGUSOAlRzKhUKrVMekIIIYQQ4s2TrnpCFDMSNAkhhBBCvH0SOAkhhBBCCCHEK0jgJIQQQgghhBCvIIGTEEIIIYQQQryCBE5CCCGEEEII8QoSOAkhhBBCCCHEK0jgJIQQQgghhBCvIIGTEEK8w2bMmEH9+vVfuk6rVq0YN27cW6lPURQYGEjJkiULuxoKDQ0NwsLCisy+BgwYQJcuXd5KfYQQoiiTwEkIId6iAQMGoKGhwbBhw55bNnLkSDQ0NBgwYMBbrVNoaCgzZ858o/u4du0aGhoaxMfHv9H9/Bu9e/fm8uXLb21/jx8/xszMjDJlypCRkfHW9luQW7du8eWXXwJF+zsSQoiiQAInIYR4y6ytrQkJCeHx48dK2ZMnTwgODqZChQpvvT5mZmYYGxu/9f2+aZmZma+1noGBAebm5m+4Nn/bunUrtWrVonr16m+tZelZecfGwsICPT29QqmDEEIUNxI4CSHEW9agQQOsra0JDQ1VykJDQ6lQoQK2trZq6/7000+0aNGCkiVLUrp0aTp27MjVq1fV1rl58yaOjo6YmZlRokQJGjZsyLFjx9TWWbduHZUqVcLU1JQ+ffrw4MEDZdmzXfUqVarEnDlzGDRoEMbGxlSoUAF/f3+197tx4wa9evWiZMmSmJmZ4eDgwLVr1/71McnNzWXu3LnY2NhgYGBAvXr12LJli7I8JycHFxcXZXm1atXw9fVVe4+8LmWzZ8/GysqKatWqKa0ooaGhfPrppxgaGlKvXj2OHDmibPdsV7287o0vO2YPHjygb9++lChRAktLSxYtWvTaXR4DAgLo168f/fr1IyAg4JXrx8bGUr9+ffT19WnYsCFhYWHPtQwdPHiQxo0bo6enh6WlJR4eHmRnZyvLW7VqxahRoxg3bhxlypShXbt2gHpXPRsbGwBsbW3R0NCgVatWavVYsGABlpaWlC5dmpEjR5KVlaUsq1SpErNmzaJ///4YGRlRsWJFwsPDSU5OxsHBASMjI+rWrcvJkyeVbf788086depEqVKlKFGiBLVq1WLnzp2vPB5CCFFYJHASQohCMGjQINasWaO8Xr16NQMHDnxuvYcPHzJ+/HhOnjzJvn370NTUpGvXruTm5gKQnp7OJ598QkJCAuHh4Zw5c4ZJkyYpywGuXr1KWFgYERERREREcPDgQebNm/fS+vn4+NCwYUNOnz7NiBEjGD58OJcuXQIgKyuLdu3aYWxszOHDh4mJicHIyIgvvvjitVt5njV37lzWrl3L8uXLOXfuHK6urvTr14+DBw8CTwOrDz74gM2bN3P+/HmmTZvG5MmT2bRpk9r77Nu3j0uXLrFnzx4iIiKUci8vL9zc3IiPj+ejjz7C0dFRLbB41quO2fjx44mJiSE8PJw9e/Zw+PBh4uLiXvk5r169ypEjR+jVqxe9evXi8OHD/Pnnny9c//79+3Tq1Ik6deoQFxfHzJkzcXd3V1snISGB9u3b06hRI86cOYOfnx8BAQHMmjVLbb2goCB0dXWJiYlh+fLlz+3r+PHjAOzdu5dbt26pBfb79+/n6tWr7N+/n6CgIAIDAwkMDFTbftGiRdjb23P69Gk6dOjAV199Rf/+/enXrx9xcXFUqVKF/v37o1KpgKddUzMyMjh06BBnz57F29sbIyOjVx5DIYQoNCohhBBvjbOzs8rBwUGVlJSk0tPTU127dk117do1lb6+vio5OVnl4OCgcnZ2fuH2ycnJKkB19uxZlUqlUq1YsUJlbGysunv3boHrT58+XWVoaKi6f/++UjZx4kRVkyZNlNeffPKJauzYscrrihUrqvr166e8zs3NVZmbm6v8/PxUKpVKtW7dOlW1atVUubm5yjoZGRkqAwMDVVRUVIH1+OOPP1SA6vTp088te/LkicrQ0FAVGxurVu7i4qJydHR8wZFQqUaOHKnq3r278trZ2VlVrlw5VUZGxnP7XbVqlVJ27tw5FaC6cOGCSqVSqdasWaMyNTVVlr/qmN2/f1+lo6Oj2rx5s7I8NTVVZWhoqHYcCzJ58mRVly5dlNcODg6q6dOnq60DqLZt26ZSqVQqPz8/VenSpVWPHz9Wlq9cuVLtWE6ePPm572PZsmUqIyMjVU5Ojkqlevod29raPlef/Pt60Xfk7Oysqlixoio7O1sp69mzp6p3797K62fPmVu3bqkA1dSpU5WyI0eOqADVrVu3VCqVSlWnTh3VjBkzXnSohBCiyJEWJyGEKARly5alQ4cOBAYGsmbNGjp06ECZMmWeW++3337D0dGRypUrY2JiQqVKlQC4fv06APHx8dja2mJmZvbCfVWqVEltDJOlpSVJSUkvrV/dunWVf2toaGBhYaFsc+bMGa5cuYKxsTFGRkYYGRlhZmbGkydPnutG+DquXLnCo0eP+Pzzz5X3MzIyYu3atWrvt2zZMuzs7ChbtixGRkb4+/srxyFPnTp10NXVfennsbS0BHjpMXjZMfv999/JysqicePGynJTU1OqVav20s+Zk5NDUFAQ/fr1U8r69etHYGCgWgthfpcuXaJu3bro6+srZfn3C3DhwgWaNWuGhoaGUmZvb096ejo3b95Uyuzs7F5av5epVasWWlpayuuCzqH8x7hcuXLA0+/j2bK87caMGcOsWbOwt7dn+vTp/PLLL/+6fkII8TZoF3YFhBDifTVo0CBGjRoFPA0KCtKpUycqVqzIypUrsbKyIjc3l9q1aytd4gwMDF65Hx0dHbXXGhoaL7xRf51t0tPTsbOzY8OGDc9tV7Zs2VfW51np6ekAREZGUr58ebVleYkLQkJCcHNzw8fHh2bNmmFsbMz8+fOfG8tVokSJV36evADjZcfg3xyzV4mKiiIhIYHevXurlefk5LBv3z4+//zz//T+r/KiY/M6Xud4FHSMX3bcBw8eTLt27YiMjGT37t3MnTsXHx8fRo8e/a/rKYQQb5K0OAkhRCHJGxOUN2boWXfv3uXSpUtMmTKF1q1bU6NGDe7du6e2Tt26dYmPjyclJeVtVZsGDRrw22+/YW5uTtWqVdX+TE1N//H71axZEz09Pa5fv/7c+1lbWwMQExND8+bNGTFiBLa2tlStWvVftW79L1SuXBkdHR1OnDihlKWlpb0ypXlAQAB9+vQhPj5e7a9Pnz4vTBJRrVo1zp49q5a2PP9+AWrUqMGRI0eUsUPw9HgZGxvzwQcfvPbnymupy8nJee1t/itra2uGDRtGaGgoEyZMYOXKlW9t30II8U9J4CSEEIVES0uLCxcucP78ebVuUHlKlSpF6dKl8ff358qVK0RHRzN+/Hi1dRwdHbGwsKBLly7ExMTw+++/s3XrVrWscf9rffv2pUyZMjg4OHD48GH++OMPDhw4wJgxY9S6hhXk0qVLzwUO+vr6uLm54erqSlBQEFevXiUuLo7vv/+eoKAgAD788ENOnjxJVFQUly9fZurUqc8FEG+LsbExzs7OTJw4kf3793Pu3DlcXFzQ1NRU6y6XX3JyMjt27MDZ2ZnatWur/fXv35+wsLACg18nJydyc3MZMmQIFy5cICoqigULFgB/t+CMGDGCGzduMHr0aC5evMj27duZPn0648ePR1Pz9X/mzc3NMTAw4KeffuL27dukpaX9i6Pz+saNG0dUVBR//PEHcXFx7N+/nxo1arzRfQohxH8hgZMQQhQiExMTTExMClymqalJSEgIp06donbt2ri6ujJ//ny1dXR1ddm9ezfm5ua0b9+eOnXqMG/evAIDsf8VQ0NDDh06RIUKFejWrRs1atTAxcWFJ0+evPCz5OnTpw+2trZqf7dv32bmzJlMnTqVuXPnUqNGDb744gsiIyOVFNlDhw6lW7du9O7dmyZNmnD37l1GjBjxxj7jqyxcuJBmzZrRsWNH2rRpg729PTVq1FAbi5Tf2rVrKVGiBK1bt35uWevWrTEwMGD9+vXPLTMxMWHHjh3Ex8dTv359vLy8mDZtGoCyr/Lly7Nz506OHz9OvXr1GDZsGC4uLkyZMuUffSZtbW2WLFnCihUrsLKywsHB4R9t/0/l5OQwcuRI5fv+6KOP+OGHH97oPoUQ4r/QUOVv2xdCCCHEP/bw4UPKly+Pj48PLi4ub3RfGzZsYODAgaSlpb3WGDchhBD/G5IcQgghhPiHTp8+zcWLF2ncuDFpaWl8++23AG+klWbt2rVUrlyZ8uXLc+bMGdzd3enVq5cETUII8ZZJ4CSEEEL8CwsWLODSpUvo6upiZ2fH4cOHC0wp/18lJiYybdo0EhMTsbS0pGfPnsyePft/vh8hhBAvJ131hBBCCCGEEOIVJDmEEEIIIYQQQryCBE5CCCGEEEII8QoSOAkhhBBCCCHEK0jgJIQQQgghhBCvIIGTEEIIIYQQQryCBE5CCCGEEEII8QoSOAkhhBBCCCHEK0jgJIQQQgghhBCv8H+bAqcXhBk/GwAAAABJRU5ErkJggg=="},"metadata":{}}]},{"cell_type":"code","source":"import pandas as pd\ngsr_features = pd.read_csv('/kaggle/input/gsr-cwt-features-extracted/gsr_cwt_features.csv'\n)\nprint(gsr_features.columns)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T07:52:31.984576Z","iopub.execute_input":"2024-11-15T07:52:31.984981Z","iopub.status.idle":"2024-11-15T07:52:33.468562Z","shell.execute_reply.started":"2024-11-15T07:52:31.984943Z","shell.execute_reply":"2024-11-15T07:52:33.467323Z"},"trusted":true},"execution_count":3,"outputs":[{"name":"stdout","text":"Index(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n       ...\n       '801', '802', '803', '804', '805', '806', '807', '808', '809', 'label'],\n      dtype='object', length=811)\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# RESOLVE ERROR FOR GETTING FEATURE COLUMNS","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import StratifiedKFold, cross_val_score, train_test_split\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.svm import SVC\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.naive_bayes import GaussianNB\nimport matplotlib.pyplot as plt\n\n# Step 1: Define function to categorize arousal level\ndef categorize_arousal_level(label):\n    second_letter = label[1]\n    if second_letter == 'L':\n        return 'Low'\n    elif second_letter == 'M':\n        return 'Medium'\n    else:\n        return 'High'\n\n# Step 2: Apply categorization function to generate new labels\ngsr_features['new_labels'] = gsr_features['label'].apply(categorize_arousal_level)\n\n# Step 3: Prepare features and labels\nfeature_columns_df = gsr_features.drop(columns=['label'])\nprint(type(feature_columns_df))\nprint(feature_columns_df.columns)\nprint(feature_columns_df.head())","metadata":{"execution":{"iopub.status.busy":"2024-11-15T07:54:59.765149Z","iopub.execute_input":"2024-11-15T07:54:59.766438Z","iopub.status.idle":"2024-11-15T07:54:59.796256Z","shell.execute_reply.started":"2024-11-15T07:54:59.766386Z","shell.execute_reply":"2024-11-15T07:54:59.795060Z"},"trusted":true},"execution_count":8,"outputs":[{"name":"stdout","text":"<class 'pandas.core.frame.DataFrame'>\nIndex(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n       ...\n       '801', '802', '803', '804', '805', '806', '807', '808', '809',\n       'new_labels'],\n      dtype='object', length=811)\n            0           1           2            3            4            5  \\\n0 -489.900064  249.957626  695.798650  1269.989317  1932.865525  2512.369072   \n1 -371.298968  188.241130  525.770448   962.464232  1467.857592  1908.403496   \n2 -332.607841  169.239480  471.893956   864.626077  1319.076539  1715.661136   \n3 -372.088379  189.657275  527.273115   971.353328  1484.931226  1910.980927   \n4 -382.798504  194.297101  541.833674   994.344921  1519.422305  1980.394334   \n\n             6            7            8            9  ...           801  \\\n0  3035.143103  3931.854024  4497.474746  5534.682888  ...  9.222004e+05   \n1  2307.558460  2997.022780  3450.632849  4261.863915  ...  1.145031e+06   \n2  2070.769858  2677.494942  3060.500768  3755.133436  ...  1.059251e+06   \n3  2296.053767  3004.335749  3473.895496  4280.011442  ...  1.243630e+06   \n4  2393.632877  3090.700393  3528.040062  4328.128452  ...  1.185605e+06   \n\n            802           803           804           805           806  \\\n0  9.237927e+05  9.255680e+05  9.274040e+05  9.292090e+05  9.309539e+05   \n1  1.147379e+06  1.144002e+06  1.140174e+06  1.140890e+06  1.143464e+06   \n2  1.060781e+06  1.062591e+06  1.054079e+06  1.052712e+06  1.054688e+06   \n3  1.245969e+06  1.248440e+06  1.235894e+06  1.236140e+06  1.237884e+06   \n4  1.187782e+06  1.189970e+06  1.179381e+06  1.178421e+06  1.180561e+06   \n\n            807           808           809  new_labels  \n0  9.268573e+05  9.285849e+05  9.076872e+05      Medium  \n1  1.146107e+06  1.146324e+06  1.148582e+06      Medium  \n2  1.056171e+06  1.058073e+06  1.059665e+06      Medium  \n3  1.240125e+06  1.242307e+06  1.244429e+06      Medium  \n4  1.182695e+06  1.184650e+06  1.186798e+06      Medium  \n\n[5 rows x 811 columns]\n","output_type":"stream"}]},{"cell_type":"code","source":"print(feature_columns_df.shape)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T07:52:45.713397Z","iopub.execute_input":"2024-11-15T07:52:45.714005Z","iopub.status.idle":"2024-11-15T07:52:45.720409Z","shell.execute_reply.started":"2024-11-15T07:52:45.713962Z","shell.execute_reply":"2024-11-15T07:52:45.719141Z"},"trusted":true},"execution_count":5,"outputs":[{"name":"stdout","text":"(2336, 811)\n","output_type":"stream"}]},{"cell_type":"raw","source":"print(gsr_features.columns)","metadata":{}},{"cell_type":"code","source":"\n# features = feature_columns_df\n\n# Step 3: Prepare features and labels by dropping the label column\nfeature_columns_df = gsr_features.drop(columns=['new_labels'])\nfeatures = feature_columns_df\nlabels = gsr_features['new_labels']\n\n# Step 4: Define the models\nmodels = {\n    'Random Forest': RandomForestClassifier(),\n    'Support Vector Classifier': SVC(),\n    'K-Nearest Neighbors': KNeighborsClassifier(),\n    'Logistic Regression': LogisticRegression(max_iter=1000),\n    'Naive Bayes': GaussianNB()\n}\n\n# Step 5: Perform Stratified Cross-Validation and store accuracies\nkfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)\nmodel_accuracies = {}\n\nfor name, model in models.items():\n    # Perform cross-validation\n    cv_accuracies = cross_val_score(model, features, labels, cv=kfold, scoring='accuracy')\n    model_accuracies[name] = cv_accuracies  # Store accuracy for each fold\n\n    # Print accuracy for each fold\n    print(f\"{name} - Cross-validation accuracies per fold: {cv_accuracies * 100}\")  # Convert to percentages\n    print(f\"{name} - Mean cross-validation accuracy: {np.mean(cv_accuracies) * 100:.2f}%\\n\")  # Convert to percentage\n\n# Calculate mean and standard deviation of cross-validation accuracies\nmean_accuracies = {name: np.mean(acc) * 100 for name, acc in model_accuracies.items()}  # Convert to percentages\nstd_accuracies = {name: np.std(acc) * 100 for name, acc in model_accuracies.items()}  # Convert to percentages\n\n# Step 6: Plot the mean cross-validation accuracies with error bars\nplt.figure(figsize=(10, 6))\nplt.bar(mean_accuracies.keys(), mean_accuracies.values(), yerr=std_accuracies.values(), capsize=5, color='skyblue')\nplt.xlabel('Machine Learning Algorithms')\nplt.ylabel('Mean Cross-Validation Accuracy (%)')\nplt.title('Comparison of Mean Cross-Validation Accuracy Across Models (Low, Medium, High Arousal)')\nplt.ylim(0, 100)\nplt.xticks(rotation=45)\nplt.show()\n\n# Step 7: Train-test split for final evaluation and compute metrics\nX_train, X_test, y_train, y_test = train_test_split(features,labels, test_size=0.2, stratify=labels, random_state=42)\n\n# Initialize lists to store metrics\nprecision_scores = []\nrecall_scores = []\nf1_scores = []\n\nfor name, model in models.items():\n    # Train and predict on the test split\n    model.fit(X_train, y_train)\n    y_pred = model.predict(X_test)\n    \n    # Calculate metrics (precision, recall, F1 score remain in 0-1 range)\n    precision = precision_score(y_test, y_pred, average='weighted')\n    recall = recall_score(y_test, y_pred, average='weighted')\n    f1 = f1_score(y_test, y_pred, average='weighted')\n    \n    precision_scores.append(precision)\n    recall_scores.append(recall)\n    f1_scores.append(f1)\n\n# Step 8: Create a DataFrame for the metrics and plot\nmetrics_df = pd.DataFrame({\n    'Model': list(models.keys()),\n    'Precision': precision_scores,\n    'Recall': recall_scores,\n    'F1-Score': f1_scores\n}).set_index('Model')\n\nmetrics_df.plot(kind='bar', figsize=(10, 6))\nplt.title('Model Comparison - Precision, Recall, and F1 Score')\nplt.xlabel('Machine Learning Algorithms')\nplt.ylabel('Score')\nplt.ylim(0, 1)\nplt.xticks(rotation=45)\nplt.legend(loc=\"upper right\")\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T07:53:29.250404Z","iopub.execute_input":"2024-11-15T07:53:29.250844Z","iopub.status.idle":"2024-11-15T07:53:31.297059Z","shell.execute_reply.started":"2024-11-15T07:53:29.250802Z","shell.execute_reply":"2024-11-15T07:53:31.295294Z"},"trusted":true},"execution_count":7,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)","Cell \u001b[0;32mIn[7], line 23\u001b[0m\n\u001b[1;32m     19\u001b[0m model_accuracies \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m     21\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, model \u001b[38;5;129;01min\u001b[39;00m models\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m     22\u001b[0m     \u001b[38;5;66;03m# Perform cross-validation\u001b[39;00m\n\u001b[0;32m---> 23\u001b[0m     cv_accuracies \u001b[38;5;241m=\u001b[39m \u001b[43mcross_val_score\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfeatures\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcv\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkfold\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mscoring\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43maccuracy\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m     24\u001b[0m     model_accuracies[name] \u001b[38;5;241m=\u001b[39m cv_accuracies  \u001b[38;5;66;03m# Store accuracy for each fold\u001b[39;00m\n\u001b[1;32m     26\u001b[0m     \u001b[38;5;66;03m# Print accuracy for each fold\u001b[39;00m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/sklearn/model_selection/_validation.py:515\u001b[0m, in \u001b[0;36mcross_val_score\u001b[0;34m(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, error_score)\u001b[0m\n\u001b[1;32m    512\u001b[0m \u001b[38;5;66;03m# To ensure multimetric format is not supported\u001b[39;00m\n\u001b[1;32m    513\u001b[0m scorer \u001b[38;5;241m=\u001b[39m check_scoring(estimator, scoring\u001b[38;5;241m=\u001b[39mscoring)\n\u001b[0;32m--> 515\u001b[0m cv_results \u001b[38;5;241m=\u001b[39m \u001b[43mcross_validate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    516\u001b[0m \u001b[43m    \u001b[49m\u001b[43mestimator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    517\u001b[0m \u001b[43m    \u001b[49m\u001b[43mX\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    518\u001b[0m \u001b[43m    \u001b[49m\u001b[43my\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    519\u001b[0m \u001b[43m    \u001b[49m\u001b[43mgroups\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    520\u001b[0m \u001b[43m    \u001b[49m\u001b[43mscoring\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mscore\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mscorer\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    521\u001b[0m \u001b[43m    \u001b[49m\u001b[43mcv\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcv\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    522\u001b[0m \u001b[43m    \u001b[49m\u001b[43mn_jobs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mn_jobs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    523\u001b[0m \u001b[43m    \u001b[49m\u001b[43mverbose\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mverbose\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    524\u001b[0m \u001b[43m    \u001b[49m\u001b[43mfit_params\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfit_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    525\u001b[0m \u001b[43m    \u001b[49m\u001b[43mpre_dispatch\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpre_dispatch\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    526\u001b[0m \u001b[43m    \u001b[49m\u001b[43merror_score\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merror_score\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    527\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    528\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m cv_results[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtest_score\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/sklearn/model_selection/_validation.py:285\u001b[0m, in \u001b[0;36mcross_validate\u001b[0;34m(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, return_train_score, return_estimator, error_score)\u001b[0m\n\u001b[1;32m    265\u001b[0m parallel \u001b[38;5;241m=\u001b[39m Parallel(n_jobs\u001b[38;5;241m=\u001b[39mn_jobs, verbose\u001b[38;5;241m=\u001b[39mverbose, pre_dispatch\u001b[38;5;241m=\u001b[39mpre_dispatch)\n\u001b[1;32m    266\u001b[0m results \u001b[38;5;241m=\u001b[39m parallel(\n\u001b[1;32m    267\u001b[0m     delayed(_fit_and_score)(\n\u001b[1;32m    268\u001b[0m         clone(estimator),\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    282\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m train, test \u001b[38;5;129;01min\u001b[39;00m cv\u001b[38;5;241m.\u001b[39msplit(X, y, groups)\n\u001b[1;32m    283\u001b[0m )\n\u001b[0;32m--> 285\u001b[0m \u001b[43m_warn_or_raise_about_fit_failures\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresults\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merror_score\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    287\u001b[0m \u001b[38;5;66;03m# For callabe scoring, the return type is only know after calling. If the\u001b[39;00m\n\u001b[1;32m    288\u001b[0m \u001b[38;5;66;03m# return type is a dictionary, the error scores can now be inserted with\u001b[39;00m\n\u001b[1;32m    289\u001b[0m \u001b[38;5;66;03m# the correct key.\u001b[39;00m\n\u001b[1;32m    290\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mcallable\u001b[39m(scoring):\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/sklearn/model_selection/_validation.py:367\u001b[0m, in \u001b[0;36m_warn_or_raise_about_fit_failures\u001b[0;34m(results, error_score)\u001b[0m\n\u001b[1;32m    360\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m num_failed_fits \u001b[38;5;241m==\u001b[39m num_fits:\n\u001b[1;32m    361\u001b[0m     all_fits_failed_message \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m    362\u001b[0m         \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mAll the \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mnum_fits\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m fits failed.\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    363\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIt is very likely that your model is misconfigured.\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    364\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou can try to debug the error by setting error_score=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mraise\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    365\u001b[0m         \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBelow are more details about the failures:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mfit_errors_summary\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    366\u001b[0m     )\n\u001b[0;32m--> 367\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(all_fits_failed_message)\n\u001b[1;32m    369\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m    370\u001b[0m     some_fits_failed_message \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m    371\u001b[0m         \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mnum_failed_fits\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m fits failed out of a total of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mnum_fits\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    372\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe score on these train-test partitions for these parameters\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    376\u001b[0m         \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBelow are more details about the failures:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mfit_errors_summary\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    377\u001b[0m     )\n","\u001b[0;31mValueError\u001b[0m: \nAll the 10 fits failed.\nIt is very likely that your model is misconfigured.\nYou can try to debug the error by setting error_score='raise'.\n\nBelow are more details about the failures:\n--------------------------------------------------------------------------------\n9 fits failed with the following error:\nTraceback (most recent call last):\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/model_selection/_validation.py\", line 686, in _fit_and_score\n    estimator.fit(X_train, y_train, **fit_params)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/ensemble/_forest.py\", line 345, in fit\n    X, y = self._validate_data(\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/base.py\", line 584, in _validate_data\n    X, y = check_X_y(X, y, **check_params)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/validation.py\", line 1106, in check_X_y\n    X = check_array(\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/validation.py\", line 879, in check_array\n    array = _asarray_with_order(array, order=order, dtype=dtype, xp=xp)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/_array_api.py\", line 185, in _asarray_with_order\n    array = numpy.asarray(array, order=order, dtype=dtype)\n  File \"/opt/conda/lib/python3.10/site-packages/pandas/core/generic.py\", line 2153, in __array__\n    arr = np.asarray(values, dtype=dtype)\nValueError: could not convert string to float: 'AMVM'\n\n--------------------------------------------------------------------------------\n1 fits failed with the following error:\nTraceback (most recent call last):\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/model_selection/_validation.py\", line 686, in _fit_and_score\n    estimator.fit(X_train, y_train, **fit_params)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/ensemble/_forest.py\", line 345, in fit\n    X, y = self._validate_data(\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/base.py\", line 584, in _validate_data\n    X, y = check_X_y(X, y, **check_params)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/validation.py\", line 1106, in check_X_y\n    X = check_array(\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/validation.py\", line 879, in check_array\n    array = _asarray_with_order(array, order=order, dtype=dtype, xp=xp)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/_array_api.py\", line 185, in _asarray_with_order\n    array = numpy.asarray(array, order=order, dtype=dtype)\n  File \"/opt/conda/lib/python3.10/site-packages/pandas/core/generic.py\", line 2153, in __array__\n    arr = np.asarray(values, dtype=dtype)\nValueError: could not convert string to float: 'AMVL'\n"],"ename":"ValueError","evalue":"\nAll the 10 fits failed.\nIt is very likely that your model is misconfigured.\nYou can try to debug the error by setting error_score='raise'.\n\nBelow are more details about the failures:\n--------------------------------------------------------------------------------\n9 fits failed with the following error:\nTraceback (most recent call last):\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/model_selection/_validation.py\", line 686, in _fit_and_score\n    estimator.fit(X_train, y_train, **fit_params)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/ensemble/_forest.py\", line 345, in fit\n    X, y = self._validate_data(\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/base.py\", line 584, in _validate_data\n    X, y = check_X_y(X, y, **check_params)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/validation.py\", line 1106, in check_X_y\n    X = check_array(\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/validation.py\", line 879, in check_array\n    array = _asarray_with_order(array, order=order, dtype=dtype, xp=xp)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/_array_api.py\", line 185, in _asarray_with_order\n    array = numpy.asarray(array, order=order, dtype=dtype)\n  File \"/opt/conda/lib/python3.10/site-packages/pandas/core/generic.py\", line 2153, in __array__\n    arr = np.asarray(values, dtype=dtype)\nValueError: could not convert string to float: 'AMVM'\n\n--------------------------------------------------------------------------------\n1 fits failed with the following error:\nTraceback (most recent call last):\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/model_selection/_validation.py\", line 686, in _fit_and_score\n    estimator.fit(X_train, y_train, **fit_params)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/ensemble/_forest.py\", line 345, in fit\n    X, y = self._validate_data(\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/base.py\", line 584, in _validate_data\n    X, y = check_X_y(X, y, **check_params)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/validation.py\", line 1106, in check_X_y\n    X = check_array(\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/validation.py\", line 879, in check_array\n    array = _asarray_with_order(array, order=order, dtype=dtype, xp=xp)\n  File \"/opt/conda/lib/python3.10/site-packages/sklearn/utils/_array_api.py\", line 185, in _asarray_with_order\n    array = numpy.asarray(array, order=order, dtype=dtype)\n  File \"/opt/conda/lib/python3.10/site-packages/pandas/core/generic.py\", line 2153, in __array__\n    arr = np.asarray(values, dtype=dtype)\nValueError: could not convert string to float: 'AMVL'\n","output_type":"error"}]},{"cell_type":"markdown","source":"# 3 Categories with only level 5 arousal as medium \n\n# 1-4 as low arousal\n\n# 6-9 as high arousal","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n\n# Specify the path to the CSV file\nfile_path = '/kaggle/input/data-intervals-not-normalized-with-labels/data_intervals_not_normalized1.csv'\n\n# Read the CSV file into a DataFrame\ndata_intervals_dataframe = pd.read_csv(file_path)\n\n# Display the first few rows to verify\nprint(data_intervals_dataframe.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T09:04:48.981646Z","iopub.execute_input":"2024-11-15T09:04:48.982164Z","iopub.status.idle":"2024-11-15T09:04:49.825303Z","shell.execute_reply.started":"2024-11-15T09:04:48.982118Z","shell.execute_reply":"2024-11-15T09:04:49.823988Z"},"trusted":true},"execution_count":6,"outputs":[{"name":"stdout","text":"   subject_id  video_id                                           gsr_data  \\\n0           7         0  179125.171875,178570.375,179391.03125,181556.2...   \n1           7         1  182172.671875,182666.59375,183080.09375,184354...   \n2           7         2  168857.21875,168781.234375,169132.53125,169823...   \n3           7         3  178895.96875,178088.4375,177970.546875,177919....   \n4           7         4  195028.421875,195278.421875,195498.46875,19572...   \n\n                                            ppg_data  valence  arousal  \\\n0  612293.0,611442.0,610770.0,610083.0,609360.0,6...        4        5   \n1  551232.0,551091.0,550905.0,550746.0,550549.0,5...        3        5   \n2  605678.0,605853.0,606119.0,606351.0,606579.0,6...        4        5   \n3  565274.0,565598.0,566007.0,566224.0,566272.0,5...        5        6   \n4  549417.0,549378.0,549404.0,549342.0,549404.0,5...        6        6   \n\n  arousal_level valence_level arousal_valence_label  \n0             M             M                  AMVM  \n1             M             L                  AMVL  \n2             M             M                  AMVM  \n3             M             M                  AMVM  \n4             M             M                  AMVM  \n","output_type":"stream"}]},{"cell_type":"code","source":"data_intervals_dataframe_updated = data_intervals_dataframe.drop(columns=['arousal_level' ,'valence_level','arousal_valence_label'])\n\nprint(data_intervals_dataframe_updated.head())\n\nprint(data_intervals_dataframe_updated.columns)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T09:07:14.044657Z","iopub.execute_input":"2024-11-15T09:07:14.045533Z","iopub.status.idle":"2024-11-15T09:07:14.057184Z","shell.execute_reply.started":"2024-11-15T09:07:14.045477Z","shell.execute_reply":"2024-11-15T09:07:14.055960Z"},"trusted":true},"execution_count":9,"outputs":[{"name":"stdout","text":"   subject_id  video_id                                           gsr_data  \\\n0           7         0  179125.171875,178570.375,179391.03125,181556.2...   \n1           7         1  182172.671875,182666.59375,183080.09375,184354...   \n2           7         2  168857.21875,168781.234375,169132.53125,169823...   \n3           7         3  178895.96875,178088.4375,177970.546875,177919....   \n4           7         4  195028.421875,195278.421875,195498.46875,19572...   \n\n                                            ppg_data  valence  arousal  \n0  612293.0,611442.0,610770.0,610083.0,609360.0,6...        4        5  \n1  551232.0,551091.0,550905.0,550746.0,550549.0,5...        3        5  \n2  605678.0,605853.0,606119.0,606351.0,606579.0,6...        4        5  \n3  565274.0,565598.0,566007.0,566224.0,566272.0,5...        5        6  \n4  549417.0,549378.0,549404.0,549342.0,549404.0,5...        6        6  \nIndex(['subject_id', 'video_id', 'gsr_data', 'ppg_data', 'valence', 'arousal'], dtype='object')\n","output_type":"stream"}]},{"cell_type":"code","source":"import pandas as pd\n\n# Assuming your dataframe is 'data_intervals_dataframe_updated'\n# Create the arousal_category column\ndata_intervals_dataframe_updated['arousal_category'] = data_intervals_dataframe_updated['arousal'].apply(\n    lambda x: 'L' if x < 5 else ('M' if x == 5 else 'H')\n)\n\n# Check the updated dataframe\nprint(data_intervals_dataframe_updated.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T09:11:44.382172Z","iopub.execute_input":"2024-11-15T09:11:44.383203Z","iopub.status.idle":"2024-11-15T09:11:44.399520Z","shell.execute_reply.started":"2024-11-15T09:11:44.383141Z","shell.execute_reply":"2024-11-15T09:11:44.397970Z"},"trusted":true},"execution_count":10,"outputs":[{"name":"stdout","text":"   subject_id  video_id                                           gsr_data  \\\n0           7         0  179125.171875,178570.375,179391.03125,181556.2...   \n1           7         1  182172.671875,182666.59375,183080.09375,184354...   \n2           7         2  168857.21875,168781.234375,169132.53125,169823...   \n3           7         3  178895.96875,178088.4375,177970.546875,177919....   \n4           7         4  195028.421875,195278.421875,195498.46875,19572...   \n\n                                            ppg_data  valence  arousal  \\\n0  612293.0,611442.0,610770.0,610083.0,609360.0,6...        4        5   \n1  551232.0,551091.0,550905.0,550746.0,550549.0,5...        3        5   \n2  605678.0,605853.0,606119.0,606351.0,606579.0,6...        4        5   \n3  565274.0,565598.0,566007.0,566224.0,566272.0,5...        5        6   \n4  549417.0,549378.0,549404.0,549342.0,549404.0,5...        6        6   \n\n  arousal_category  \n0                M  \n1                M  \n2                M  \n3                H  \n4                H  \n","output_type":"stream"}]},{"cell_type":"code","source":"print(data_intervals_dataframe_updated['arousal_category'].unique())\n\n# Get the value counts of each unique value in the 'arousal_category' column\nvalue_counts = data_intervals_dataframe_updated['arousal_category'].value_counts()\n\n# Print the value counts\nprint(value_counts)","metadata":{"execution":{"iopub.status.busy":"2024-11-15T09:13:10.879290Z","iopub.execute_input":"2024-11-15T09:13:10.879926Z","iopub.status.idle":"2024-11-15T09:13:10.894886Z","shell.execute_reply.started":"2024-11-15T09:13:10.879843Z","shell.execute_reply":"2024-11-15T09:13:10.893542Z"},"trusted":true},"execution_count":13,"outputs":[{"name":"stdout","text":"['M' 'H' 'L']\narousal_category\nL    1167\nH     654\nM     515\nName: count, dtype: int64\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# PPG FREQUENCY AND TIME FEATURES","metadata":{}},{"cell_type":"code","source":"# Apply the functions to 'ppg_filtered_data' in preprocessed_dataframe\ntime_features = data_intervals_dataframe_updated['ppg_data'].apply(\n    lambda x: pd.Series({\n        'mean': np.mean(x),\n        'var': np.var(x),\n        'median': np.median(x),\n        'max': np.max(x),\n        'min': np.min(x),\n        'range': ranges(x),\n        'rmssd': rmssd(x),\n        'sdsd': sdsd(x),\n        'nni_50': nni_50(x),\n        'pnni_50': pnni_50(x),\n        'nni_20': nni_20(x),\n        'pnni_20': pnni_20(x),\n        'avg_hr': avg_hr(x),\n        'std_hr': std_hr(x),\n        'min_hr': min_hr(x),\n        'max_hr': max_hr(x),\n        'energy': energy(x),\n        'abs_sum_diff': abs_sum_diff(x)\n    })\n)\n\n# Reset the index to align with the preprocessed_dataframe\ntime_features = time_features.reset_index(drop=True)\n\n# Add the 'subject_id', 'video_id', and 'arousal_valence_label' to the time_features dataframe\ntime_features['subject_id'] = data_intervals_dataframe_updated['subject_id']\ntime_features['video_id'] = data_intervals_dataframe_updated['video_id']\ntime_features['arousal_valence_label'] = data_intervals_dataframe_updated['arousal_valence_label']\n\n# Optionally, check the result\nprint(time_features.head())\n","metadata":{"execution":{"iopub.status.busy":"2024-11-15T09:19:37.790299Z","iopub.execute_input":"2024-11-15T09:19:37.790864Z","iopub.status.idle":"2024-11-15T09:19:39.557404Z","shell.execute_reply.started":"2024-11-15T09:19:37.790797Z","shell.execute_reply":"2024-11-15T09:19:39.555447Z"},"trusted":true},"execution_count":16,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mUFuncTypeError\u001b[0m                            Traceback (most recent call last)","Cell \u001b[0;32mIn[16], line 2\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;66;03m# Apply the functions to 'ppg_filtered_data' in preprocessed_dataframe\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m time_features \u001b[38;5;241m=\u001b[39m \u001b[43mdata_intervals_dataframe_updated\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mppg_data\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m      3\u001b[0m \u001b[43m    \u001b[49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mSeries\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\n\u001b[1;32m      4\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmean\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmean\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m      5\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mvar\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvar\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m      6\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmedian\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmedian\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m      7\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmax\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m      8\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmin\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m      9\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mrange\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mranges\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     10\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mrmssd\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mrmssd\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     11\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msdsd\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43msdsd\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     12\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mnni_50\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnni_50\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     13\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mpnni_50\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mpnni_50\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     14\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mnni_20\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnni_20\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     15\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mpnni_20\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mpnni_20\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     16\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mavg_hr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mavg_hr\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     17\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mstd_hr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstd_hr\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     18\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmin_hr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmin_hr\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     19\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmax_hr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_hr\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     20\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43menergy\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43menergy\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     21\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mabs_sum_diff\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mabs_sum_diff\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     22\u001b[0m \u001b[43m    \u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     23\u001b[0m \u001b[43m)\u001b[49m\n\u001b[1;32m     25\u001b[0m \u001b[38;5;66;03m# Reset the index to align with the preprocessed_dataframe\u001b[39;00m\n\u001b[1;32m     26\u001b[0m time_features \u001b[38;5;241m=\u001b[39m time_features\u001b[38;5;241m.\u001b[39mreset_index(drop\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/series.py:4924\u001b[0m, in \u001b[0;36mSeries.apply\u001b[0;34m(self, func, convert_dtype, args, by_row, **kwargs)\u001b[0m\n\u001b[1;32m   4789\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mapply\u001b[39m(\n\u001b[1;32m   4790\u001b[0m     \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m   4791\u001b[0m     func: AggFuncType,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m   4796\u001b[0m     \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[1;32m   4797\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m DataFrame \u001b[38;5;241m|\u001b[39m Series:\n\u001b[1;32m   4798\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m   4799\u001b[0m \u001b[38;5;124;03m    Invoke function on values of Series.\u001b[39;00m\n\u001b[1;32m   4800\u001b[0m \n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m   4915\u001b[0m \u001b[38;5;124;03m    dtype: float64\u001b[39;00m\n\u001b[1;32m   4916\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[1;32m   4917\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mSeriesApply\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m   4918\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m   4919\u001b[0m \u001b[43m        \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   4920\u001b[0m \u001b[43m        \u001b[49m\u001b[43mconvert_dtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconvert_dtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   4921\u001b[0m \u001b[43m        \u001b[49m\u001b[43mby_row\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mby_row\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   4922\u001b[0m \u001b[43m        \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   4923\u001b[0m \u001b[43m        \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m-> 4924\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/apply.py:1427\u001b[0m, in \u001b[0;36mSeriesApply.apply\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   1424\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_compat()\n\u001b[1;32m   1426\u001b[0m \u001b[38;5;66;03m# self.func is Callable\u001b[39;00m\n\u001b[0;32m-> 1427\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply_standard\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/apply.py:1507\u001b[0m, in \u001b[0;36mSeriesApply.apply_standard\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   1501\u001b[0m \u001b[38;5;66;03m# row-wise access\u001b[39;00m\n\u001b[1;32m   1502\u001b[0m \u001b[38;5;66;03m# apply doesn't have a `na_action` keyword and for backward compat reasons\u001b[39;00m\n\u001b[1;32m   1503\u001b[0m \u001b[38;5;66;03m# we need to give `na_action=\"ignore\"` for categorical data.\u001b[39;00m\n\u001b[1;32m   1504\u001b[0m \u001b[38;5;66;03m# TODO: remove the `na_action=\"ignore\"` when that default has been changed in\u001b[39;00m\n\u001b[1;32m   1505\u001b[0m \u001b[38;5;66;03m#  Categorical (GH51645).\u001b[39;00m\n\u001b[1;32m   1506\u001b[0m action \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(obj\u001b[38;5;241m.\u001b[39mdtype, CategoricalDtype) \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 1507\u001b[0m mapped \u001b[38;5;241m=\u001b[39m \u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_map_values\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m   1508\u001b[0m \u001b[43m    \u001b[49m\u001b[43mmapper\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcurried\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mna_action\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maction\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconvert\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconvert_dtype\u001b[49m\n\u001b[1;32m   1509\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1511\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(mapped) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(mapped[\u001b[38;5;241m0\u001b[39m], ABCSeries):\n\u001b[1;32m   1512\u001b[0m     \u001b[38;5;66;03m# GH#43986 Need to do list(mapped) in order to get treated as nested\u001b[39;00m\n\u001b[1;32m   1513\u001b[0m     \u001b[38;5;66;03m#  See also GH#25959 regarding EA support\u001b[39;00m\n\u001b[1;32m   1514\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m obj\u001b[38;5;241m.\u001b[39m_constructor_expanddim(\u001b[38;5;28mlist\u001b[39m(mapped), index\u001b[38;5;241m=\u001b[39mobj\u001b[38;5;241m.\u001b[39mindex)\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/base.py:921\u001b[0m, in \u001b[0;36mIndexOpsMixin._map_values\u001b[0;34m(self, mapper, na_action, convert)\u001b[0m\n\u001b[1;32m    918\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(arr, ExtensionArray):\n\u001b[1;32m    919\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m arr\u001b[38;5;241m.\u001b[39mmap(mapper, na_action\u001b[38;5;241m=\u001b[39mna_action)\n\u001b[0;32m--> 921\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43malgorithms\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap_array\u001b[49m\u001b[43m(\u001b[49m\u001b[43marr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmapper\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mna_action\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mna_action\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconvert\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconvert\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/algorithms.py:1743\u001b[0m, in \u001b[0;36mmap_array\u001b[0;34m(arr, mapper, na_action, convert)\u001b[0m\n\u001b[1;32m   1741\u001b[0m values \u001b[38;5;241m=\u001b[39m arr\u001b[38;5;241m.\u001b[39mastype(\u001b[38;5;28mobject\u001b[39m, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m   1742\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m na_action \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1743\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mlib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap_infer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmapper\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconvert\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconvert\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1744\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m   1745\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m lib\u001b[38;5;241m.\u001b[39mmap_infer_mask(\n\u001b[1;32m   1746\u001b[0m         values, mapper, mask\u001b[38;5;241m=\u001b[39misna(values)\u001b[38;5;241m.\u001b[39mview(np\u001b[38;5;241m.\u001b[39muint8), convert\u001b[38;5;241m=\u001b[39mconvert\n\u001b[1;32m   1747\u001b[0m     )\n","File \u001b[0;32mlib.pyx:2972\u001b[0m, in \u001b[0;36mpandas._libs.lib.map_infer\u001b[0;34m()\u001b[0m\n","Cell \u001b[0;32mIn[16], line 4\u001b[0m, in \u001b[0;36m<lambda>\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;66;03m# Apply the functions to 'ppg_filtered_data' in preprocessed_dataframe\u001b[39;00m\n\u001b[1;32m      2\u001b[0m time_features \u001b[38;5;241m=\u001b[39m data_intervals_dataframe_updated[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mppg_data\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mapply(\n\u001b[1;32m      3\u001b[0m     \u001b[38;5;28;01mlambda\u001b[39;00m x: pd\u001b[38;5;241m.\u001b[39mSeries({\n\u001b[0;32m----> 4\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmean\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmean\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m      5\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mvar\u001b[39m\u001b[38;5;124m'\u001b[39m: np\u001b[38;5;241m.\u001b[39mvar(x),\n\u001b[1;32m      6\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmedian\u001b[39m\u001b[38;5;124m'\u001b[39m: np\u001b[38;5;241m.\u001b[39mmedian(x),\n\u001b[1;32m      7\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmax\u001b[39m\u001b[38;5;124m'\u001b[39m: np\u001b[38;5;241m.\u001b[39mmax(x),\n\u001b[1;32m      8\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmin\u001b[39m\u001b[38;5;124m'\u001b[39m: np\u001b[38;5;241m.\u001b[39mmin(x),\n\u001b[1;32m      9\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrange\u001b[39m\u001b[38;5;124m'\u001b[39m: ranges(x),\n\u001b[1;32m     10\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrmssd\u001b[39m\u001b[38;5;124m'\u001b[39m: rmssd(x),\n\u001b[1;32m     11\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msdsd\u001b[39m\u001b[38;5;124m'\u001b[39m: sdsd(x),\n\u001b[1;32m     12\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnni_50\u001b[39m\u001b[38;5;124m'\u001b[39m: nni_50(x),\n\u001b[1;32m     13\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpnni_50\u001b[39m\u001b[38;5;124m'\u001b[39m: pnni_50(x),\n\u001b[1;32m     14\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnni_20\u001b[39m\u001b[38;5;124m'\u001b[39m: nni_20(x),\n\u001b[1;32m     15\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpnni_20\u001b[39m\u001b[38;5;124m'\u001b[39m: pnni_20(x),\n\u001b[1;32m     16\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mavg_hr\u001b[39m\u001b[38;5;124m'\u001b[39m: avg_hr(x),\n\u001b[1;32m     17\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstd_hr\u001b[39m\u001b[38;5;124m'\u001b[39m: std_hr(x),\n\u001b[1;32m     18\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmin_hr\u001b[39m\u001b[38;5;124m'\u001b[39m: min_hr(x),\n\u001b[1;32m     19\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmax_hr\u001b[39m\u001b[38;5;124m'\u001b[39m: max_hr(x),\n\u001b[1;32m     20\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124menergy\u001b[39m\u001b[38;5;124m'\u001b[39m: energy(x),\n\u001b[1;32m     21\u001b[0m         \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mabs_sum_diff\u001b[39m\u001b[38;5;124m'\u001b[39m: abs_sum_diff(x)\n\u001b[1;32m     22\u001b[0m     })\n\u001b[1;32m     23\u001b[0m )\n\u001b[1;32m     25\u001b[0m \u001b[38;5;66;03m# Reset the index to align with the preprocessed_dataframe\u001b[39;00m\n\u001b[1;32m     26\u001b[0m time_features \u001b[38;5;241m=\u001b[39m time_features\u001b[38;5;241m.\u001b[39mreset_index(drop\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/numpy/core/fromnumeric.py:3504\u001b[0m, in \u001b[0;36mmean\u001b[0;34m(a, axis, dtype, out, keepdims, where)\u001b[0m\n\u001b[1;32m   3501\u001b[0m     \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m   3502\u001b[0m         \u001b[38;5;28;01mreturn\u001b[39;00m mean(axis\u001b[38;5;241m=\u001b[39maxis, dtype\u001b[38;5;241m=\u001b[39mdtype, out\u001b[38;5;241m=\u001b[39mout, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m-> 3504\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_methods\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_mean\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   3505\u001b[0m \u001b[43m                      \u001b[49m\u001b[43mout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/numpy/core/_methods.py:118\u001b[0m, in \u001b[0;36m_mean\u001b[0;34m(a, axis, dtype, out, keepdims, where)\u001b[0m\n\u001b[1;32m    115\u001b[0m         dtype \u001b[38;5;241m=\u001b[39m mu\u001b[38;5;241m.\u001b[39mdtype(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mf4\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m    116\u001b[0m         is_float16_result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m--> 118\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mumr_sum\u001b[49m\u001b[43m(\u001b[49m\u001b[43marr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkeepdims\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwhere\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mwhere\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    119\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(ret, mu\u001b[38;5;241m.\u001b[39mndarray):\n\u001b[1;32m    120\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m _no_nep50_warning():\n","\u001b[0;31mUFuncTypeError\u001b[0m: ufunc 'add' did not contain a loop with signature matching types (dtype('<U19808'), dtype('<U19808')) -> None"],"ename":"UFuncTypeError","evalue":"ufunc 'add' did not contain a loop with signature matching types (dtype('<U19808'), dtype('<U19808')) -> None","output_type":"error"}]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# IGNORE FROM HERE\n\n# Multi input LSTM with separate layer for PPG & GSR","metadata":{}},{"cell_type":"code","source":"# import torch\n# import torch.nn as nn\n# import torch.optim as optim\n# from torch.utils.data import DataLoader, random_split, TensorDataset\n# import matplotlib.pyplot as plt\n\n# # Check if GPU is available\n# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n# print(f\"Using device: {device}\")\n\n# # Assume data_intervals is already populated from previous steps\n\n# # Split data into train and test sets (80% train, 20% test)\n# train_size = int(0.8 * len(data_intervals))\n# test_size = len(data_intervals) - train_size\n# train_data, test_data = random_split(data_intervals, [train_size, test_size])\n\n# # Convert data_intervals entries into tensors for PyTorch\n# def prepare_data(data):\n#     ppg_sequences = []\n#     gsr_sequences = []\n#     labels = []\n\n#     for item in data:\n#         ppg_sequences.append(torch.tensor(item['ppg_data'], dtype=torch.float32))\n#         gsr_sequences.append(torch.tensor(item['gsr_data'], dtype=torch.float32))\n#         labels.append(torch.tensor([item['arousal'], item['valence']], dtype=torch.float32))\n\n#     # Stack sequences and labels to create tensor batches\n#     ppg_sequences = nn.utils.rnn.pad_sequence(ppg_sequences, batch_first=True)\n#     gsr_sequences = nn.utils.rnn.pad_sequence(gsr_sequences, batch_first=True)\n#     labels = torch.stack(labels)\n\n#     return TensorDataset(ppg_sequences, gsr_sequences, labels)\n\n# train_dataset = prepare_data(train_data)\n# test_dataset = prepare_data(test_data)\n\n# # Load data into DataLoaders\n# batch_size = 32\n# train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n# test_loader = DataLoader(test_dataset, batch_size=batch_size)\n\n# # Define the LSTM model with separate layers for PPG and GSR data\n# class MultiInputLSTM(nn.Module):\n#     def __init__(self, input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers=1, dropout=0.3):\n#         super(MultiInputLSTM, self).__init__()\n#         # LSTM for PPG data\n#         self.lstm_ppg = nn.LSTM(input_size_ppg, hidden_size, num_layers, batch_first=True, dropout=dropout)\n        \n#         # LSTM for GSR data\n#         self.lstm_gsr = nn.LSTM(input_size_gsr, hidden_size, num_layers, batch_first=True, dropout=dropout)\n        \n#         # Fully connected layer to combine the outputs and predict arousal and valence\n#         self.fc = nn.Linear(hidden_size * 2, output_size)\n#         self.fc_dropout = nn.Dropout(dropout)  # Dropout after fully connected layer\n\n#     def forward(self, ppg_data, gsr_data):\n#         # PPG LSTM forward\n#         _, (h_ppg, _) = self.lstm_ppg(ppg_data)\n#         h_ppg = h_ppg[-1]  # Take the final hidden state\n\n#         # GSR LSTM forward\n#         _, (h_gsr, _) = self.lstm_gsr(gsr_data)\n#         h_gsr = h_gsr[-1]  # Take the final hidden state\n\n#         # Concatenate the hidden states from both LSTMs\n#         combined = torch.cat((h_ppg, h_gsr), dim=1)\n        \n#         # Apply dropout after fully connected layer\n#         output = self.fc(combined)\n#         output = self.fc_dropout(output)\n#         return output\n\n# # Model parameters\n# input_size_ppg = 1  # Assuming PPG data is a single feature per timestep\n# input_size_gsr = 1  # Assuming GSR data is a single feature per timestep\n# hidden_size = 128   # Changed hidden size\n# output_size = 2  # Arousal and Valence\n# num_layers = 2    # Changed number of layers\n# dropout = 0.3     # Dropout rate\n\n# # Instantiate the model, loss function, and optimizer with weight decay (L2 regularization)\n# model = MultiInputLSTM(input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers, dropout)\n# model.to(device)  # Move model to GPU if available\n# criterion = nn.MSELoss()\n# optimizer = optim.Adam(model.parameters(), lr=0.0001, weight_decay=1e-5)  # Added weight decay\n\n# # Training function with validation evaluation\n# def train(model, train_loader, test_loader, criterion, optimizer, epochs=500):\n#     train_losses = []\n#     val_losses = []\n#     train_accuracies = []\n#     val_accuracies = []\n\n#     for epoch in range(epochs):\n#         model.train()\n#         total_train_loss = 0\n#         correct_train_predictions = 0\n#         total_train_predictions = 0\n\n#         for ppg_data, gsr_data, labels in train_loader:\n#             ppg_data = ppg_data.unsqueeze(-1).to(device)  # Move data to GPU\n#             gsr_data = gsr_data.unsqueeze(-1).to(device)  # Move data to GPU\n#             labels = labels.to(device)  # Move labels to GPU\n            \n#             # Zero the gradients\n#             optimizer.zero_grad()\n            \n#             # Forward pass\n#             outputs = model(ppg_data, gsr_data)\n#             loss = criterion(outputs, labels)\n#             total_train_loss += loss.item()\n            \n#             # Backward and optimize\n#             loss.backward()\n#             optimizer.step()\n            \n#             # Calculate training accuracy\n#             predictions = outputs.round()  # Rounding predictions to nearest integer\n#             correct_train_predictions += (predictions == labels).sum().item()\n#             total_train_predictions += labels.numel()\n\n#         # Calculate average training loss and accuracy\n#         avg_train_loss = total_train_loss / len(train_loader)\n#         train_losses.append(avg_train_loss)\n#         train_accuracy = (correct_train_predictions / total_train_predictions) * 100\n#         train_accuracies.append(train_accuracy)\n        \n#         # Evaluate on validation set\n#         val_loss, val_accuracy = evaluate(model, test_loader, criterion)\n#         val_losses.append(val_loss)\n#         val_accuracies.append(val_accuracy)\n\n#         print(f\"Epoch [{epoch+1}/{epochs}], \"\n#               f\"Train Loss: {avg_train_loss:.4f}, \"\n#               f\"Train Accuracy: {train_accuracy:.2f}%, \"\n#               f\"Validation Loss: {val_loss:.4f}, \"\n#               f\"Validation Accuracy: {val_accuracy:.2f}%\")\n\n#     return train_losses, val_losses, train_accuracies, val_accuracies\n\n# # Evaluation function\n# def evaluate(model, data_loader, criterion):\n#     model.eval()\n#     total_loss = 0\n#     correct_predictions = 0\n#     total_predictions = 0\n\n#     with torch.no_grad():\n#         for ppg_data, gsr_data, labels in data_loader:\n#             ppg_data = ppg_data.unsqueeze(-1).to(device)  # Move data to GPU\n#             gsr_data = gsr_data.unsqueeze(-1).to(device)  # Move data to GPU\n#             labels = labels.to(device)  # Move labels to GPU\n#             outputs = model(ppg_data, gsr_data)\n#             loss = criterion(outputs, labels)\n#             total_loss += loss.item()\n\n#             # Calculate accuracy based on mean absolute error tolerance\n#             predictions = outputs.round()  # Rounding predictions to nearest integer\n#             correct_predictions += (predictions == labels).sum().item()\n#             total_predictions += labels.numel()\n\n#     avg_loss = total_loss / len(data_loader)\n#     accuracy = (correct_predictions / total_predictions) * 100\n#     return avg_loss, accuracy\n\n# # Train the model and retrieve metrics\n# epochs = 500  # Changed epochs to 500\n# train_losses, val_losses, train_accuracies, val_accuracies = train(model, train_loader, test_loader, criterion, optimizer, epochs=epochs)\n\n# # Plotting training and validation loss\n# plt.figure(figsize=(12, 6))\n# plt.subplot(1, 2, 1)\n# plt.plot(range(1, epochs + 1), train_losses, label='Training Loss')\n# plt.plot(range(1, epochs + 1), val_losses, label='Validation Loss')\n# plt.xlabel('Epochs')\n# plt.ylabel('Loss')\n# plt.legend()\n# plt.title('Training and Validation Loss')\n\n# # Plotting training and validation accuracy\n# plt.subplot(1, 2, 2)\n# plt.plot(range(1, epochs + 1), train_accuracies, label='Training Accuracy')\n# plt.plot(range(1, epochs + 1), val_accuracies, label='Validation Accuracy')\n# plt.xlabel('Epochs')\n# plt.ylabel('Accuracy (%)')\n# plt.legend()\n# plt.title('Training and Validation Accuracy')\n\n# plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T19:02:41.732485Z","iopub.execute_input":"2024-11-13T19:02:41.732924Z","iopub.status.idle":"2024-11-13T19:09:55.918421Z","shell.execute_reply.started":"2024-11-13T19:02:41.732886Z","shell.execute_reply":"2024-11-13T19:09:55.91716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Categorical Ouptuts without label encoding","metadata":{}},{"cell_type":"code","source":"# import torch\n# import torch.nn as nn\n# import torch.optim as optim\n# from torch.utils.data import DataLoader, random_split, TensorDataset\n# import matplotlib.pyplot as plt\n\n# # Assume data_intervals is already populated from previous steps\n\n# # Split data into train and test sets (80% train, 20% test)\n# train_size = int(0.8 * len(data_intervals))\n# test_size = len(data_intervals) - train_size\n# train_data, test_data = random_split(data_intervals, [train_size, test_size])\n\n# # Convert data_intervals entries into tensors for PyTorch\n# def prepare_data(data):\n#     ppg_sequences = []\n#     gsr_sequences = []\n#     labels = []\n\n#     for item in data:\n#         ppg_sequences.append(torch.tensor(item['ppg_data'], dtype=torch.float32))\n#         gsr_sequences.append(torch.tensor(item['gsr_data'], dtype=torch.float32))\n#         # Convert arousal and valence to integer class indices (1-9 for both, adjusting to 0-8)\n#         arousal_class = int(item['arousal']) - 1  # Adjusting arousal to range 0-8\n#         valence_class = int(item['valence']) - 1  # Adjusting valence to range 0-8\n#         # Combine the classes into a single value (arousal class * 9 + valence class)\n#         combined_class = arousal_class * 9 + valence_class\n#         labels.append(torch.tensor(combined_class, dtype=torch.long))  # Long tensor for classification\n\n#     # Stack sequences and labels to create tensor batches\n#     ppg_sequences = nn.utils.rnn.pad_sequence(ppg_sequences, batch_first=True)\n#     gsr_sequences = nn.utils.rnn.pad_sequence(gsr_sequences, batch_first=True)\n#     labels = torch.stack(labels)\n\n#     return TensorDataset(ppg_sequences, gsr_sequences, labels)\n\n# train_dataset = prepare_data(train_data)\n# test_dataset = prepare_data(test_data)\n\n# # Load data into DataLoaders\n# batch_size = 32\n# train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n# test_loader = DataLoader(test_dataset, batch_size=batch_size)\n\n# # Define the LSTM model with separate layers for PPG and GSR data\n# class MultiInputLSTM(nn.Module):\n#     def __init__(self, input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers=1):\n#         super(MultiInputLSTM, self).__init__()\n#         # LSTM for PPG data\n#         self.lstm_ppg = nn.LSTM(input_size_ppg, hidden_size, num_layers, batch_first=True)\n        \n#         # LSTM for GSR data\n#         self.lstm_gsr = nn.LSTM(input_size_gsr, hidden_size, num_layers, batch_first=True)\n        \n#         # Fully connected layer to combine the outputs and predict arousal and valence\n#         self.fc = nn.Linear(hidden_size * 2, output_size)\n\n#     def forward(self, ppg_data, gsr_data):\n#         # PPG LSTM forward\n#         _, (h_ppg, _) = self.lstm_ppg(ppg_data)\n#         h_ppg = h_ppg[-1]  # Take the final hidden state\n\n#         # GSR LSTM forward\n#         _, (h_gsr, _) = self.lstm_gsr(gsr_data)\n#         h_gsr = h_gsr[-1]  # Take the final hidden state\n\n#         # Concatenate the hidden states from both LSTMs\n#         combined = torch.cat((h_ppg, h_gsr), dim=1)\n        \n#         # Fully connected output layer with softmax for categorical prediction\n#         output = self.fc(combined)\n#         return output\n\n# # Model parameters\n# input_size_ppg = 1  # Assuming PPG data is a single feature per timestep\n# input_size_gsr = 1  # Assuming GSR data is a single feature per timestep\n# hidden_size = 128   # Updated hidden size\n# output_size = 81    # 81 classes for combined arousal (0-8) and valence (0-8)\n# num_layers = 1\n\n# # Instantiate the model, loss function, and optimizer\n# model = MultiInputLSTM(input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers)\n# criterion = nn.CrossEntropyLoss()  # CrossEntropyLoss for classification\n# optimizer = optim.Adam(model.parameters(), lr=0.0001)\n\n# # Training function with validation evaluation\n# def train(model, train_loader, test_loader, criterion, optimizer, epochs=500):\n#     train_losses = []\n#     val_losses = []\n#     train_accuracies = []\n#     val_accuracies = []\n\n#     for epoch in range(epochs):\n#         model.train()\n#         total_train_loss = 0\n#         correct_train_predictions = 0\n#         total_train_predictions = 0\n\n#         for ppg_data, gsr_data, labels in train_loader:\n#             ppg_data = ppg_data.unsqueeze(-1)\n#             gsr_data = gsr_data.unsqueeze(-1)\n            \n#             # Zero the gradients\n#             optimizer.zero_grad()\n            \n#             # Forward pass\n#             outputs = model(ppg_data, gsr_data)\n#             loss = criterion(outputs, labels)  # Directly use labels without reshaping\n#             total_train_loss += loss.item()\n            \n#             # Backward and optimize\n#             loss.backward()\n#             optimizer.step()\n            \n#             # Calculate training accuracy\n#             _, predicted = torch.max(outputs, 1)  # Get the predicted class index\n#             correct_train_predictions += (predicted == labels).sum().item()\n#             total_train_predictions += labels.numel()\n        \n#         # Calculate average training loss and accuracy\n#         avg_train_loss = total_train_loss / len(train_loader)\n#         train_losses.append(avg_train_loss)\n#         train_accuracy = (correct_train_predictions / total_train_predictions) * 100\n#         train_accuracies.append(train_accuracy)\n        \n#         # Evaluate on validation set\n#         val_loss, val_accuracy = evaluate(model, test_loader, criterion)\n#         val_losses.append(val_loss)\n#         val_accuracies.append(val_accuracy)\n\n#         print(f\"Epoch [{epoch+1}/{epochs}], \"\n#               f\"Train Loss: {avg_train_loss:.4f}, \"\n#               f\"Train Accuracy: {train_accuracy:.2f}%, \"\n#               f\"Validation Loss: {val_loss:.4f}, \"\n#               f\"Validation Accuracy: {val_accuracy:.2f}%\")\n\n#     return train_losses, val_losses, train_accuracies, val_accuracies\n\n# # Evaluation function\n# def evaluate(model, data_loader, criterion):\n#     model.eval()\n#     total_loss = 0\n#     correct_predictions = 0\n#     total_predictions = 0\n\n#     with torch.no_grad():\n#         for ppg_data, gsr_data, labels in data_loader:\n#             ppg_data = ppg_data.unsqueeze(-1)\n#             gsr_data = gsr_data.unsqueeze(-1)\n#             outputs = model(ppg_data, gsr_data)\n#             loss = criterion(outputs, labels)\n#             total_loss += loss.item()\n\n#             # Calculate accuracy\n#             _, predicted = torch.max(outputs, 1)\n#             correct_predictions += (predicted == labels).sum().item()\n#             total_predictions += labels.numel()\n\n#     avg_loss = total_loss / len(data_loader)\n#     accuracy = (correct_predictions / total_predictions) * 100\n#     return avg_loss, accuracy\n\n# # Train the model and retrieve metrics\n# epochs = 500  # Updated epochs to 500\n# train_losses, val_losses, train_accuracies, val_accuracies = train(model, train_loader, test_loader, criterion, optimizer, epochs=epochs)\n\n# # Plotting training and validation loss\n# plt.figure(figsize=(12, 6))\n# plt.subplot(1, 2, 1)\n# plt.plot(range(1, epochs + 1), train_losses, label='Training Loss')\n# plt.plot(range(1, epochs + 1), val_losses, label='Validation Loss')\n# plt.xlabel('Epochs')\n# plt.ylabel('Loss')\n# plt.legend()\n# plt.title('Training and Validation Loss')\n\n# # Plotting training and validation accuracy\n# plt.subplot(1, 2, 2)\n# plt.plot(range(1, epochs + 1), train_accuracies, label='Training Accuracy')\n# plt.plot(range(1, epochs + 1), val_accuracies, label='Validation Accuracy')\n# plt.xlabel('Epochs')\n# plt.ylabel('Accuracy (%)')\n# plt.legend()\n# plt.title('Training and Validation Accuracy')\n\n# plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T19:27:46.018357Z","iopub.execute_input":"2024-11-13T19:27:46.019327Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Categorical Outputs with label encoding low medium high A & V","metadata":{}},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import DataLoader, random_split, TensorDataset\nimport matplotlib.pyplot as plt\nfrom sklearn.preprocessing import LabelEncoder\nimport random\nimport numpy as np\n\n# Set seed for reproducibility\nseed = 42\ntorch.manual_seed(seed)\nnp.random.seed(seed)\nrandom.seed(seed)\nif torch.cuda.is_available():\n    torch.cuda.manual_seed_all(seed)\n\n# Check if GPU is available and set device\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(f\"Using device: {device}\")\n\n# Assume data_intervals is already populated from previous steps\n\n# Initialize the LabelEncoder for 9 unique arousal-valence combinations\nlabel_encoder = LabelEncoder()\narousal_valence_labels = [item['arousal_valence_label'] for item in data_intervals]\nlabel_encoder.fit(arousal_valence_labels)\n\n# Split data into train and test sets (80% train, 20% test)\ntrain_size = int(0.8 * len(data_intervals))\ntest_size = len(data_intervals) - train_size\ntrain_data, test_data = random_split(data_intervals, [train_size, test_size])\n\ndef prepare_data(data):\n    ppg_sequences = []\n    gsr_sequences = []\n    labels = []\n\n    for item in data:\n        ppg_sequences.append(torch.tensor(item['ppg_data'], dtype=torch.float32))\n        gsr_sequences.append(torch.tensor(item['gsr_data'], dtype=torch.float32))\n        combined_class = label_encoder.transform([item['arousal_valence_label']])[0]\n        labels.append(torch.tensor(combined_class, dtype=torch.long))\n\n    ppg_sequences = nn.utils.rnn.pad_sequence(ppg_sequences, batch_first=True)\n    gsr_sequences = nn.utils.rnn.pad_sequence(gsr_sequences, batch_first=True)\n    labels = torch.stack(labels)\n\n    return TensorDataset(ppg_sequences, gsr_sequences, labels)\n\ntrain_dataset = prepare_data(train_data)\ntest_dataset = prepare_data(test_data)\n\nbatch_size = 32\ntrain_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\ntest_loader = DataLoader(test_dataset, batch_size=batch_size)\n\nclass MultiInputLSTM(nn.Module):\n    def __init__(self, input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers=1):\n        super(MultiInputLSTM, self).__init__()\n        self.lstm_ppg = nn.LSTM(input_size_ppg, hidden_size, num_layers, batch_first=True)\n        self.lstm_gsr = nn.LSTM(input_size_gsr, hidden_size, num_layers, batch_first=True)\n        self.fc = nn.Linear(hidden_size * 2, output_size)\n\n    def forward(self, ppg_data, gsr_data):\n        _, (h_ppg, _) = self.lstm_ppg(ppg_data)\n        h_ppg = h_ppg[-1]\n        _, (h_gsr, _) = self.lstm_gsr(gsr_data)\n        h_gsr = h_gsr[-1]\n        combined = torch.cat((h_ppg, h_gsr), dim=1)\n        output = self.fc(combined)\n        return output\n\ninput_size_ppg = 1\ninput_size_gsr = 1\nhidden_size = 128\noutput_size = 9\nnum_layers = 1\n\n# Instantiate the model, loss function, and optimizer\nmodel = MultiInputLSTM(input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers).to(device)\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.0001)\n\n# Function to train the model with saving best model state\ndef train(model, train_loader, test_loader, criterion, optimizer, epochs=500):\n    train_losses = []\n    val_losses = []\n    train_accuracies = []\n    val_accuracies = []\n    best_val_accuracy = 0.0  # Track the best validation accuracy\n    best_model_state = None  # To store the best model state\n\n    for epoch in range(epochs):\n        model.train()\n        total_train_loss = 0\n        correct_train_predictions = 0\n        total_train_predictions = 0\n\n        for ppg_data, gsr_data, labels in train_loader:\n            ppg_data = ppg_data.unsqueeze(-1).to(device)\n            gsr_data = gsr_data.unsqueeze(-1).to(device)\n            labels = labels.to(device)\n\n            optimizer.zero_grad()\n            outputs = model(ppg_data, gsr_data)\n            loss = criterion(outputs, labels)\n            total_train_loss += loss.item()\n\n            loss.backward()\n            optimizer.step()\n\n            _, predicted = torch.max(outputs, 1)\n            correct_train_predictions += (predicted == labels).sum().item()\n            total_train_predictions += labels.numel()\n\n        avg_train_loss = total_train_loss / len(train_loader)\n        train_losses.append(avg_train_loss)\n        train_accuracy = (correct_train_predictions / total_train_predictions) * 100\n        train_accuracies.append(train_accuracy)\n\n        val_loss, val_accuracy = evaluate(model, test_loader, criterion)\n        val_losses.append(val_loss)\n        val_accuracies.append(val_accuracy)\n\n        # Check if current model is the best, and save if it is\n        if val_accuracy > best_val_accuracy:\n            best_val_accuracy = val_accuracy\n            best_model_state = model.state_dict()  # Save the model state\n\n        print(f\"Epoch [{epoch+1}/{epochs}], \"\n              f\"Train Loss: {avg_train_loss:.4f}, \"\n              f\"Train Accuracy: {train_accuracy:.2f}%, \"\n              f\"Validation Loss: {val_loss:.4f}, \"\n              f\"Validation Accuracy: {val_accuracy:.2f}%\")\n\n    # Save the best model state to a file\n    torch.save(best_model_state, \"best_model.pth\")\n    print(f\"Best model saved with validation accuracy: {best_val_accuracy:.2f}%\")\n\n    return train_losses, val_losses, train_accuracies, val_accuracies\n\ndef evaluate(model, data_loader, criterion):\n    model.eval()\n    total_loss = 0\n    correct_predictions = 0\n    total_predictions = 0\n\n    with torch.no_grad():\n        for ppg_data, gsr_data, labels in data_loader:\n            ppg_data = ppg_data.unsqueeze(-1).to(device)\n            gsr_data = gsr_data.unsqueeze(-1).to(device)\n            labels = labels.to(device)\n\n            outputs = model(ppg_data, gsr_data)\n            loss = criterion(outputs, labels)\n            total_loss += loss.item()\n\n            _, predicted = torch.max(outputs, 1)\n            correct_predictions += (predicted == labels).sum().item()\n            total_predictions += labels.numel()\n\n    avg_loss = total_loss / len(data_loader)\n    accuracy = (correct_predictions / total_predictions) * 100\n    return avg_loss, accuracy\n\nepochs = 500\ntrain_losses, val_losses, train_accuracies, val_accuracies = train(model, train_loader, test_loader, criterion, optimizer, epochs=epochs)\n\nplt.figure(figsize=(12, 6))\nplt.subplot(1, 2, 1)\nplt.plot(range(1, epochs + 1), train_losses, label='Training Loss')\nplt.plot(range(1, epochs + 1), val_losses, label='Validation Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.title('Training and Validation Loss')\n\nplt.subplot(1, 2, 2)\nplt.plot(range(1, epochs + 1), train_accuracies, label='Training Accuracy')\nplt.plot(range(1, epochs + 1), val_accuracies, label='Validation Accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy (%)')\nplt.legend()\nplt.title('Training and Validation Accuracy')\n\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-14T03:55:49.516294Z","iopub.execute_input":"2024-11-14T03:55:49.516687Z","iopub.status.idle":"2024-11-14T04:00:16.972822Z","shell.execute_reply.started":"2024-11-14T03:55:49.516642Z","shell.execute_reply":"2024-11-14T04:00:16.971517Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Regression values as outputs","metadata":{}},{"cell_type":"code","source":"# import torch\n# import torch.nn as nn\n# import torch.optim as optim\n# from torch.utils.data import DataLoader, random_split, TensorDataset\n# import matplotlib.pyplot as plt\n\n# # Assume data_intervals is already populated from previous steps\n\n# # Check if GPU is available and use it\n# device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n# # Split data into train and test sets (80% train, 20% test)\n# train_size = int(0.8 * len(data_intervals))\n# test_size = len(data_intervals) - train_size\n# train_data, test_data = random_split(data_intervals, [train_size, test_size])\n\n# # Convert data_intervals entries into tensors for PyTorch\n# def prepare_data(data):\n#     ppg_sequences = []\n#     gsr_sequences = []\n#     labels = []\n\n#     for item in data:\n#         ppg_sequences.append(torch.tensor(item['ppg_data'], dtype=torch.float32))\n#         gsr_sequences.append(torch.tensor(item['gsr_data'], dtype=torch.float32))\n#         labels.append(torch.tensor([item['arousal'], item['valence']], dtype=torch.float32))\n\n#     # Stack sequences and labels to create tensor batches\n#     ppg_sequences = nn.utils.rnn.pad_sequence(ppg_sequences, batch_first=True)\n#     gsr_sequences = nn.utils.rnn.pad_sequence(gsr_sequences, batch_first=True)\n#     labels = torch.stack(labels)\n\n#     return TensorDataset(ppg_sequences, gsr_sequences, labels)\n\n# train_dataset = prepare_data(train_data)\n# test_dataset = prepare_data(test_data)\n\n# # Load data into DataLoaders\n# batch_size = 32\n# train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n# test_loader = DataLoader(test_dataset, batch_size=batch_size)\n\n# # Define the LSTM model with separate layers for PPG and GSR data\n# class MultiInputLSTM(nn.Module):\n#     def __init__(self, input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers=1):\n#         super(MultiInputLSTM, self).__init__()\n#         # LSTM for PPG data\n#         self.lstm_ppg = nn.LSTM(input_size_ppg, hidden_size, num_layers, batch_first=True)\n        \n#         # LSTM for GSR data\n#         self.lstm_gsr = nn.LSTM(input_size_gsr, hidden_size, num_layers, batch_first=True)\n        \n#         # Fully connected layer to combine the outputs and predict arousal and valence\n#         self.fc = nn.Linear(hidden_size * 2, output_size)\n\n#     def forward(self, ppg_data, gsr_data):\n#         # PPG LSTM forward\n#         _, (h_ppg, _) = self.lstm_ppg(ppg_data)\n#         h_ppg = h_ppg[-1]  # Take the final hidden state\n\n#         # GSR LSTM forward\n#         _, (h_gsr, _) = self.lstm_gsr(gsr_data)\n#         h_gsr = h_gsr[-1]  # Take the final hidden state\n\n#         # Concatenate the hidden states from both LSTMs\n#         combined = torch.cat((h_ppg, h_gsr), dim=1)\n        \n#         # Fully connected output layer\n#         output = self.fc(combined)\n#         return output\n\n# # Model parameters\n# input_size_ppg = 1  # Assuming PPG data is a single feature per timestep\n# input_size_gsr = 1  # Assuming GSR data is a single feature per timestep\n# hidden_size = 128   # Updated hidden size\n# output_size = 2     # Arousal and Valence\n# num_layers = 1\n\n# # Instantiate the model, loss function, and optimizer\n# model = MultiInputLSTM(input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers)\n# model = model.to(device)  # Move model to GPU if available\n# criterion = nn.MSELoss()\n# optimizer = optim.Adam(model.parameters(), lr=0.0001)\n\n# # Training function with validation evaluation\n# def train(model, train_loader, test_loader, criterion, optimizer, epochs=500):\n#     train_losses = []\n#     val_losses = []\n#     train_accuracies = []\n#     val_accuracies = []\n\n#     for epoch in range(epochs):\n#         model.train()\n#         total_train_loss = 0\n#         correct_train_predictions = 0\n#         total_train_predictions = 0\n\n#         for ppg_data, gsr_data, labels in train_loader:\n#             ppg_data = ppg_data.unsqueeze(-1).to(device)  # Move data to GPU\n#             gsr_data = gsr_data.unsqueeze(-1).to(device)  # Move data to GPU\n#             labels = labels.to(device)  # Move labels to GPU\n            \n#             # Zero the gradients\n#             optimizer.zero_grad()\n            \n#             # Forward pass\n#             outputs = model(ppg_data, gsr_data)\n#             loss = criterion(outputs, labels)\n#             total_train_loss += loss.item()\n            \n#             # Backward and optimize\n#             loss.backward()\n#             optimizer.step()\n            \n#             # Calculate training accuracy\n#             predictions = outputs.round()  # Rounding predictions to nearest integer\n#             correct_train_predictions += (predictions == labels).sum().item()\n#             total_train_predictions += labels.numel()\n        \n#         # Calculate average training loss and accuracy\n#         avg_train_loss = total_train_loss / len(train_loader)\n#         train_losses.append(avg_train_loss)\n#         train_accuracy = (correct_train_predictions / total_train_predictions) * 100\n#         train_accuracies.append(train_accuracy)\n        \n#         # Evaluate on validation set\n#         val_loss, val_accuracy = evaluate(model, test_loader, criterion)\n#         val_losses.append(val_loss)\n#         val_accuracies.append(val_accuracy)\n\n#         print(f\"Epoch [{epoch+1}/{epochs}], \"\n#               f\"Train Loss: {avg_train_loss:.4f}, \"\n#               f\"Train Accuracy: {train_accuracy:.2f}%, \"\n#               f\"Validation Loss: {val_loss:.4f}, \"\n#               f\"Validation Accuracy: {val_accuracy:.2f}%\")\n\n#     return train_losses, val_losses, train_accuracies, val_accuracies\n\n# # Evaluation function\n# def evaluate(model, data_loader, criterion):\n#     model.eval()\n#     total_loss = 0\n#     correct_predictions = 0\n#     total_predictions = 0\n\n#     with torch.no_grad():\n#         for ppg_data, gsr_data, labels in data_loader:\n#             ppg_data = ppg_data.unsqueeze(-1).to(device)  # Move data to GPU\n#             gsr_data = gsr_data.unsqueeze(-1).to(device)  # Move data to GPU\n#             labels = labels.to(device)  # Move labels to GPU\n#             outputs = model(ppg_data, gsr_data)\n#             loss = criterion(outputs, labels)\n#             total_loss += loss.item()\n\n#             # Calculate accuracy based on mean absolute error tolerance\n#             predictions = outputs.round()  # Rounding predictions to nearest integer\n#             correct_predictions += (predictions == labels).sum().item()\n#             total_predictions += labels.numel()\n\n#     avg_loss = total_loss / len(data_loader)\n#     accuracy = (correct_predictions / total_predictions) * 100\n#     return avg_loss, accuracy\n\n# # Train the model and retrieve metrics\n# epochs = 500  # Updated epochs to 500\n# train_losses, val_losses, train_accuracies, val_accuracies = train(model, train_loader, test_loader, criterion, optimizer, epochs=epochs)\n\n# # Plotting training and validation loss\n# plt.figure(figsize=(12, 6))\n# plt.subplot(1, 2, 1)\n# plt.plot(range(1, epochs + 1), train_losses, label='Training Loss')\n# plt.plot(range(1, epochs + 1), val_losses, label='Validation Loss')\n# plt.xlabel('Epochs')\n# plt.ylabel('Loss')\n# plt.legend()\n# plt.title('Training and Validation Loss')\n\n# # Plotting training and validation accuracy\n# plt.subplot(1, 2, 2)\n# plt.plot(range(1, epochs + 1), train_accuracies, label='Training Accuracy')\n# plt.plot(range(1, epochs + 1), val_accuracies, label='Validation Accuracy')\n# plt.xlabel('Epochs')\n# plt.ylabel('Accuracy (%)')\n# plt.legend()\n# plt.title('Training and Validation Accuracy')\n\n# plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T19:15:37.52818Z","iopub.execute_input":"2024-11-13T19:15:37.528672Z","iopub.status.idle":"2024-11-13T19:20:12.779908Z","shell.execute_reply.started":"2024-11-13T19:15:37.528631Z","shell.execute_reply":"2024-11-13T19:20:12.778575Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"# import torch\n# import torch.nn as nn\n# import torch.optim as optim\n# from torch.utils.data import DataLoader, random_split, TensorDataset\n# import matplotlib.pyplot as plt\n\n# # Assume data_intervals is already populated from previous steps\n\n# # Split data into train and test sets (80% train, 20% test)\n# train_size = int(0.8 * len(data_intervals))\n# test_size = len(data_intervals) - train_size\n# train_data, test_data = random_split(data_intervals, [train_size, test_size])\n\n# # Convert data_intervals entries into tensors for PyTorch\n# def prepare_data(data):\n#     ppg_sequences = []\n#     gsr_sequences = []\n#     labels = []\n\n#     for item in data:\n#         ppg_sequences.append(torch.tensor(item['ppg_data'], dtype=torch.float32))\n#         gsr_sequences.append(torch.tensor(item['gsr_data'], dtype=torch.float32))\n#         labels.append(torch.tensor([item['arousal'], item['valence']], dtype=torch.float32))\n\n#     # Stack sequences and labels to create tensor batches\n#     ppg_sequences = nn.utils.rnn.pad_sequence(ppg_sequences, batch_first=True)\n#     gsr_sequences = nn.utils.rnn.pad_sequence(gsr_sequences, batch_first=True)\n#     labels = torch.stack(labels)\n\n#     return TensorDataset(ppg_sequences, gsr_sequences, labels)\n\n# train_dataset = prepare_data(train_data)\n# test_dataset = prepare_data(test_data)\n\n# # Load data into DataLoaders\n# batch_size = 32\n# train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n# test_loader = DataLoader(test_dataset, batch_size=batch_size)\n\n# # Define the LSTM model with separate layers for PPG and GSR data\n# class MultiInputLSTM(nn.Module):\n#     def __init__(self, input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers=1):\n#         super(MultiInputLSTM, self).__init__()\n#         # LSTM for PPG data\n#         self.lstm_ppg = nn.LSTM(input_size_ppg, hidden_size, num_layers, batch_first=True)\n        \n#         # LSTM for GSR data\n#         self.lstm_gsr = nn.LSTM(input_size_gsr, hidden_size, num_layers, batch_first=True)\n        \n#         # Fully connected layer to combine the outputs and predict arousal and valence\n#         self.fc = nn.Linear(hidden_size * 2, output_size)\n\n#     def forward(self, ppg_data, gsr_data):\n#         # PPG LSTM forward\n#         _, (h_ppg, _) = self.lstm_ppg(ppg_data)\n#         h_ppg = h_ppg[-1]  # Take the final hidden state\n\n#         # GSR LSTM forward\n#         _, (h_gsr, _) = self.lstm_gsr(gsr_data)\n#         h_gsr = h_gsr[-1]  # Take the final hidden state\n\n#         # Concatenate the hidden states from both LSTMs\n#         combined = torch.cat((h_ppg, h_gsr), dim=1)\n        \n#         # Fully connected output layer\n#         output = self.fc(combined)\n#         return output\n\n# # Model parameters\n# input_size_ppg = 1  # Assuming PPG data is a single feature per timestep\n# input_size_gsr = 1  # Assuming GSR data is a single feature per timestep\n# hidden_size = 64\n# output_size = 2  # Arousal and Valence\n# num_layers = 1\n\n# # Instantiate the model, loss function, and optimizer\n# model = MultiInputLSTM(input_size_ppg, input_size_gsr, hidden_size, output_size, num_layers)\n# criterion = nn.MSELoss()\n# optimizer = optim.Adam(model.parameters(), lr=0.0001)\n\n# # Training function with validation evaluation\n# def train(model, train_loader, test_loader, criterion, optimizer, epochs=50):\n#     train_losses = []\n#     val_losses = []\n#     train_accuracies = []\n#     val_accuracies = []\n\n#     for epoch in range(epochs):\n#         model.train()\n#         total_train_loss = 0\n\n#         for ppg_data, gsr_data, labels in train_loader:\n#             ppg_data = ppg_data.unsqueeze(-1)\n#             gsr_data = gsr_data.unsqueeze(-1)\n            \n#             # Zero the gradients\n#             optimizer.zero_grad()\n            \n#             # Forward pass\n#             outputs = model(ppg_data, gsr_data)\n#             loss = criterion(outputs, labels)\n#             total_train_loss += loss.item()\n            \n#             # Backward and optimize\n#             loss.backward()\n#             optimizer.step()\n        \n#         # Calculate average training loss\n#         avg_train_loss = total_train_loss / len(train_loader)\n#         train_losses.append(avg_train_loss)\n        \n#         # Evaluate on validation set\n#         val_loss, val_accuracy = evaluate(model, test_loader, criterion)\n#         val_losses.append(val_loss)\n#         val_accuracies.append(val_accuracy)\n\n#         print(f\"Epoch [{epoch+1}/{epochs}], \"\n#               f\"Train Loss: {avg_train_loss:.4f}, \"\n#               f\"Validation Loss: {val_loss:.4f}, \"\n#               f\"Validation Accuracy: {val_accuracy:.2f}%\")\n\n#     return train_losses, val_losses, val_accuracies\n\n# # Evaluation function\n# def evaluate(model, data_loader, criterion):\n#     model.eval()\n#     total_loss = 0\n#     correct_predictions = 0\n#     total_predictions = 0\n\n#     with torch.no_grad():\n#         for ppg_data, gsr_data, labels in data_loader:\n#             ppg_data = ppg_data.unsqueeze(-1)\n#             gsr_data = gsr_data.unsqueeze(-1)\n#             outputs = model(ppg_data, gsr_data)\n#             loss = criterion(outputs, labels)\n#             total_loss += loss.item()\n\n#             # Calculate accuracy based on mean absolute error tolerance\n#             predictions = outputs.round()  # Rounding predictions to nearest integer\n#             correct_predictions += (predictions == labels).sum().item()\n#             total_predictions += labels.numel()\n\n#     avg_loss = total_loss / len(data_loader)\n#     accuracy = (correct_predictions / total_predictions) * 100\n#     return avg_loss, accuracy\n\n# # Train the model and retrieve metrics\n# epochs = 200\n# train_losses, val_losses, val_accuracies = train(model, train_loader, test_loader, criterion, optimizer, epochs=epochs)\n\n# # Plotting training and validation loss\n# plt.figure(figsize=(12, 6))\n# plt.subplot(1, 2, 1)\n# plt.plot(range(1, epochs + 1), train_losses, label='Training Loss')\n# plt.plot(range(1, epochs + 1), val_losses, label='Validation Loss')\n# plt.xlabel('Epochs')\n# plt.ylabel('Loss')\n# plt.legend()\n# plt.title('Training and Validation Loss')\n\n# # Plotting validation accuracy\n# plt.subplot(1, 2, 2)\n# plt.plot(range(1, epochs + 1), val_accuracies, label='Validation Accuracy')\n# plt.xlabel('Epochs')\n# plt.ylabel('Accuracy (%)')\n# plt.legend()\n# plt.title('Validation Accuracy')\n\n# plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T18:01:36.457614Z","iopub.execute_input":"2024-11-13T18:01:36.457985Z","iopub.status.idle":"2024-11-13T18:02:52.103983Z","shell.execute_reply.started":"2024-11-13T18:01:36.457952Z","shell.execute_reply":"2024-11-13T18:02:52.102672Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Get unique values in the start_stop_trigger column\n# unique_triggers = sample_raw_ppg['start_stop_trigger'].unique()\n# unique_triggers_num = sample_raw_ppg['start_stop_trigger'].nunique()\n# # Print the unique start_stop_trigger values\n# print(\"Unique start_stop_triggers in PPG data:\", unique_triggers)\n# print(unique_triggers_num)","metadata":{"execution":{"iopub.status.busy":"2024-11-13T17:29:30.368297Z","iopub.execute_input":"2024-11-13T17:29:30.368995Z","iopub.status.idle":"2024-11-13T17:29:30.373354Z","shell.execute_reply.started":"2024-11-13T17:29:30.368944Z","shell.execute_reply":"2024-11-13T17:29:30.372288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# print(sample_raw_gsr['gsr_value'])\n\n# gsr_10 = sample_raw_gsr['gsr_value']\n","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:31.670392Z","iopub.execute_input":"2024-11-10T09:07:31.671179Z","iopub.status.idle":"2024-11-10T09:07:31.679014Z","shell.execute_reply.started":"2024-11-10T09:07:31.671132Z","shell.execute_reply":"2024-11-10T09:07:31.678008Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# print(gsr_10)","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:31.680253Z","iopub.execute_input":"2024-11-10T09:07:31.681168Z","iopub.status.idle":"2024-11-10T09:07:31.689479Z","shell.execute_reply.started":"2024-11-10T09:07:31.681082Z","shell.execute_reply":"2024-11-10T09:07:31.688427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# gsr_10.shape","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:31.690581Z","iopub.execute_input":"2024-11-10T09:07:31.691518Z","iopub.status.idle":"2024-11-10T09:07:31.698723Z","shell.execute_reply.started":"2024-11-10T09:07:31.691469Z","shell.execute_reply":"2024-11-10T09:07:31.697936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # for ppg\n\n# # sample_raw_ppg = pd.read_csv(\n# #    '/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/10/10/raw_ppg.csv', \n# #     names=['timestamp', 'ppg_value', 'extra_column'],  # Define expected columns\n# #     na_values=[''],  # Treat empty strings as NaN\n# #     skiprows=1  # Skip header if needed\n# # )\n# sample_raw_ppg = pd.read_csv(\n#    '/kaggle/input/raw_data_ppg_gsr/10/10/raw_ppg.csv', \n#     names=['timestamp', 'ppg_value', 'extra_column'],  # Define expected columns\n#     na_values=[''],  # Treat empty strings as NaN\n#     skiprows=1  # Skip header if needed\n# )\n# print(sample_raw_ppg['ppg_value'])\n# ppg_10 = sample_raw_ppg['ppg_value']","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:31.699707Z","iopub.execute_input":"2024-11-10T09:07:31.700053Z","iopub.status.idle":"2024-11-10T09:07:31.820494Z","shell.execute_reply.started":"2024-11-10T09:07:31.70002Z","shell.execute_reply":"2024-11-10T09:07:31.819387Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ppg_10.shape","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:31.824436Z","iopub.execute_input":"2024-11-10T09:07:31.824745Z","iopub.status.idle":"2024-11-10T09:07:31.830657Z","shell.execute_reply.started":"2024-11-10T09:07:31.824713Z","shell.execute_reply":"2024-11-10T09:07:31.829838Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Organize data as shown below :\n\nX_train :\n\n| subject_id | sequence_id | ppg_series | gsr_series |\n|------------|-------------|------------|------------|\n| 1          | 1           | [...]      | [...]      |\n| 1          | 2           | [...]      | [...]      |\n| 1          | 3           | [...]      | [...]      |\n| 2          | 1           | [...]      | [...]      |\n| 2          | 2           | [...]      | [...]      |\n| 2          | 3           | [...]      | [...]      |\n\n\ny_train :\n\n| subject_id | sequence_id | arousal | valence |\n|------------|-------------|---------|---------|\n| 1          | 1           | 7       | 6       |\n| 1          | 2           | 9       | 8       |\n| 1          | 3           | 4       | 5       |\n| 2          | 1           | 6       | 2       |\n| 2          | 2           | 8       | 4       |\n| 2          | 3           | 5       | 6       |","metadata":{}},{"cell_type":"markdown","source":"# Updated features_target dataframe\n\n| subject_id | series_id | ppg_series | gsr_series | Target |\n|------------|-----------|------------|------------|--------|\n| 1          | 1         | [...]      | [...]      | AxVy   |\n| 1          | 2         | [...]      | [...]      | AxVy   |\n| 1          | 3         | [...]      | [...]      | AxVy   |\n| 2          | 1         | [...]      | [...]      | AxVy   |\n| 2          | 2         | [...]      | [...]      | AxVy   |\n| 2          | 3         | [...]      | [...]      | AxVy   |\n\n","metadata":{}},{"cell_type":"code","source":"# import os\n# import pandas as pd\n# import numpy as np\n\n# # Initialize an empty list to store data for each row\n# data = []\n\n# # Define the base directory\n# # base_dir = '/kaggle/input/raw-ppg-gsr-data-for-emotion-recognition/raw_data_ppg_gsr/'\n# base_dir = '/kaggle/input/raw_data_ppg_gsr/'\n\n# # Loop through each subject's subdirectory\n# for subject_folder in os.listdir(base_dir):\n#     subject_dir = os.path.join(base_dir, subject_folder, subject_folder)\n    \n#     if os.path.isdir(subject_dir):  # Check if it’s a directory\n#         subject_id = int(subject_folder)  # Extract subject_id from folder name\n        \n#         # Load raw_gsr.csv and raw_ppg.csv with specific column names\n#         raw_gsr_path = os.path.join(subject_dir, 'raw_gsr.csv')\n#         raw_ppg_path = os.path.join(subject_dir, 'raw_ppg.csv')\n        \n#         # Define column names and load the data, treating empty strings as NaN and skipping the header row\n#         raw_gsr = pd.read_csv(\n#             raw_gsr_path, \n#             names=['timestamp', 'gsr_value', 'extra_column'], \n#             na_values=[''], \n#             skiprows=1\n#         )['gsr_value']  # Select only the 'gsr_value' column\n\n#         raw_ppg = pd.read_csv(\n#             raw_ppg_path, \n#             names=['timestamp', 'ppg_value', 'extra_column'], \n#             na_values=[''], \n#             skiprows=1\n#         )['ppg_value']  # Select only the 'ppg_value' column\n        \n#         # Calculate downsampling factor\n#         gsr_downsample_factor = len(raw_gsr) // 6000\n#         ppg_downsample_factor = len(raw_ppg) // 6000\n        \n#         # Downsample by taking every nth data point\n#         downsampled_gsr = raw_gsr.iloc[::gsr_downsample_factor].head(6000)\n#         downsampled_ppg = raw_ppg.iloc[::ppg_downsample_factor].head(6000)\n        \n#         # Split the downsampled data into chunks of 200 for each row in the DataFrame\n#         gsr_chunks = np.array_split(downsampled_gsr.values.flatten(), 30)\n#         ppg_chunks = np.array_split(downsampled_ppg.values.flatten(), 30)\n        \n#         # Load Arousal_Valence.csv for target labels\n#         av_path = os.path.join(subject_dir, 'Arousal_Valence.csv')\n#         av_data = pd.read_csv(av_path)\n\n#         for series_id in range(1, 31):  # For each of the 30 sequences per subject\n#             # Extract the chunk of 200 values for gsr_series and ppg_series\n#             gsr_series = gsr_chunks[series_id - 1]\n#             ppg_series = ppg_chunks[series_id - 1]\n            \n#             # Create target label in \"AxVy\" format\n#             valence = int(av_data.iloc[series_id - 1, 1])  # Second column is Valence\n#             arousal = int(av_data.iloc[series_id - 1, 2])  # Third column is Arousal\n#             target = f\"A{arousal}V{valence}\"\n            \n#             # Append the data to the list\n#             data.append({\n#                 'subject_id': subject_id,\n#                 'series_id': series_id,\n#                 'ppg_series': ppg_series,\n#                 'gsr_series': gsr_series,\n#                 'target': target\n#             })\n\n# # Convert the list of dictionaries to a DataFrame\n# features_target = pd.DataFrame(data)\n\n# # Display the first few rows of the DataFrame\n# features_target.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:31.832055Z","iopub.execute_input":"2024-11-10T09:07:31.832402Z","iopub.status.idle":"2024-11-10T09:07:40.501827Z","shell.execute_reply.started":"2024-11-10T09:07:31.83237Z","shell.execute_reply":"2024-11-10T09:07:40.500802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Function to categorize Arousal (A) and Valence (V)\n# def categorize_arousal_valence(target_value):\n#     # Extract the Arousal (Ax) and Valence (Vy) digits\n#     arousal_level = int(target_value[1])\n#     valence_level = int(target_value[3])\n    \n#     # Determine arousal label\n#     if 1 <= arousal_level <= 3:\n#         arousal_label = 'L'\n#     elif 4 <= arousal_level <= 6:\n#         arousal_label = 'M'\n#     elif 7 <= arousal_level <= 9:\n#         arousal_label = 'H'\n    \n#     # Determine valence label\n#     if 1 <= valence_level <= 3:\n#         valence_label = 'L'\n#     elif 4 <= valence_level <= 6:\n#         valence_label = 'M'\n#     elif 7 <= valence_level <= 9:\n#         valence_label = 'H'\n    \n#     # Create the grouped target label\n#     return f\"A{arousal_label}V{valence_label}\"\n\n# # Apply the function to each row in the DataFrame\n# features_target['grouped_target'] = features_target['target'].apply(categorize_arousal_valence)\n\n# # Display the updated DataFrame\n# print(features_target)","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:40.503023Z","iopub.execute_input":"2024-11-10T09:07:40.503368Z","iopub.status.idle":"2024-11-10T09:07:40.529477Z","shell.execute_reply.started":"2024-11-10T09:07:40.503334Z","shell.execute_reply":"2024-11-10T09:07:40.528458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features_target.shape","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:40.530897Z","iopub.execute_input":"2024-11-10T09:07:40.531575Z","iopub.status.idle":"2024-11-10T09:07:40.542167Z","shell.execute_reply.started":"2024-11-10T09:07:40.531526Z","shell.execute_reply":"2024-11-10T09:07:40.541037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# List all unique subject_id values","metadata":{}},{"cell_type":"code","source":"unique_subject_ids = features_target['subject_id'].unique()\nprint(unique_subject_ids)\n","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:40.543396Z","iopub.execute_input":"2024-11-10T09:07:40.543776Z","iopub.status.idle":"2024-11-10T09:07:40.550729Z","shell.execute_reply.started":"2024-11-10T09:07:40.54374Z","shell.execute_reply":"2024-11-10T09:07:40.549601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Count of unique subject_id values","metadata":{}},{"cell_type":"code","source":"unique_subject_count = features_target['subject_id'].nunique()\nprint(unique_subject_count)\n","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:40.551876Z","iopub.execute_input":"2024-11-10T09:07:40.552663Z","iopub.status.idle":"2024-11-10T09:07:40.558607Z","shell.execute_reply.started":"2024-11-10T09:07:40.552622Z","shell.execute_reply":"2024-11-10T09:07:40.557551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# After preprocessing check that each subject id has the same number of sequence ids (value counts)","metadata":{}},{"cell_type":"code","source":"import os\nimport torch\nimport numpy as np\nimport pandas as pd\nfrom tqdm.auto import tqdm\n\nimport torch\nimport torch.autograd as autograd\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torch.utils.data import Dataset, DataLoader\n\nimport seaborn as sns\nfrom pylab import rcParams\nimport matplotlib.pyplot as plt\nfrom matplotlib import rc\nfrom matplotlib.ticker import MaxNLocator\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\n\nfrom multiprocessing import cpu_count\n\nfrom sklearn.metrics import classification_report , confusion_matrix","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:40.559781Z","iopub.execute_input":"2024-11-10T09:07:40.56013Z","iopub.status.idle":"2024-11-10T09:07:42.811689Z","shell.execute_reply.started":"2024-11-10T09:07:40.560088Z","shell.execute_reply":"2024-11-10T09:07:42.810684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocessing to convert string values of surfaces to integers for neural network","metadata":{}},{"cell_type":"code","source":"# USING NUMERIC VALUES OF AROUSAL & VALENCE AS IS\n\n# label_encoder = LabelEncoder()\n# encoded_labels = label_encoder.fit_transform(features_target.target)\n\n# # GROUPING NUMERIC VALUES BASED ON RANGES: 1-3, 4-6 AND 7-9\n# label_encoder = LabelEncoder()\n# encoded_labels = label_encoder.fit_transform(features_target.grouped_target)","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:42.81299Z","iopub.execute_input":"2024-11-10T09:07:42.813533Z","iopub.status.idle":"2024-11-10T09:07:42.819681Z","shell.execute_reply.started":"2024-11-10T09:07:42.813485Z","shell.execute_reply":"2024-11-10T09:07:42.81871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"encoded_labels","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:42.820833Z","iopub.execute_input":"2024-11-10T09:07:42.82123Z","iopub.status.idle":"2024-11-10T09:07:42.834108Z","shell.execute_reply.started":"2024-11-10T09:07:42.821186Z","shell.execute_reply":"2024-11-10T09:07:42.832909Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n#labels are stored in the classes_ property in label encoder\nlabel_encoder.classes_\n# to reverse transformation if and when needed","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:42.835268Z","iopub.execute_input":"2024-11-10T09:07:42.835663Z","iopub.status.idle":"2024-11-10T09:07:42.843395Z","shell.execute_reply.started":"2024-11-10T09:07:42.835617Z","shell.execute_reply":"2024-11-10T09:07:42.842415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features_target['label']=encoded_labels","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:42.844613Z","iopub.execute_input":"2024-11-10T09:07:42.844906Z","iopub.status.idle":"2024-11-10T09:07:42.851777Z","shell.execute_reply.started":"2024-11-10T09:07:42.84487Z","shell.execute_reply":"2024-11-10T09:07:42.85087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unique_labels_count = features_target['label'].nunique()\nprint(unique_labels_count)","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:42.852928Z","iopub.execute_input":"2024-11-10T09:07:42.853268Z","iopub.status.idle":"2024-11-10T09:07:42.86081Z","shell.execute_reply.started":"2024-11-10T09:07:42.853236Z","shell.execute_reply":"2024-11-10T09:07:42.859937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features_target.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:42.861978Z","iopub.execute_input":"2024-11-10T09:07:42.862336Z","iopub.status.idle":"2024-11-10T09:07:42.888941Z","shell.execute_reply.started":"2024-11-10T09:07:42.862303Z","shell.execute_reply":"2024-11-10T09:07:42.888103Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import pandas as pd\n# import torch\n# from sklearn.model_selection import train_test_split\n# from torch.utils.data import Dataset\n\n# # Step 1: Initialize an empty list to store sequences and labels\n# sequences = []\n\n# # Step 2: Iterate through each row in features_target DataFrame to create sequence_features and add to sequences list\n# for _, row in features_target.iterrows():\n#     # Extract the first 200 values from ppg_series and gsr_series, assuming they are stored as arrays\n#     sequence_features = pd.DataFrame({\n#         'ppg_series': row['ppg_series'][:200],\n#         'gsr_series': row['gsr_series'][:200]\n#     })\n    \n#     # Append (sequence_features, label) as a tuple to the sequences list\n#     sequences.append((sequence_features, row['label']))","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:42.890047Z","iopub.execute_input":"2024-11-10T09:07:42.890411Z","iopub.status.idle":"2024-11-10T09:07:43.424666Z","shell.execute_reply.started":"2024-11-10T09:07:42.890368Z","shell.execute_reply":"2024-11-10T09:07:43.423871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"train_sequences, test_sequences = train_test_split(sequences, test_size=0.2)\n\nlen(train_sequences) , len(test_sequences)","metadata":{}},{"cell_type":"code","source":"# Step 3: Split into training and test sets\ntrain_sequences, test_sequences = train_test_split(sequences, test_size=0.2)\nlen(train_sequences), len(test_sequences)","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:43.425765Z","iopub.execute_input":"2024-11-10T09:07:43.426082Z","iopub.status.idle":"2024-11-10T09:07:43.433784Z","shell.execute_reply.started":"2024-11-10T09:07:43.426038Z","shell.execute_reply":"2024-11-10T09:07:43.432811Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Dataset class\n# class MixedEmotionDataset(Dataset): \n#     def __init__(self, sequences):\n#         self.sequences = sequences\n        \n#     def __len__(self):\n#         return len(self.sequences)\n    \n#     def __getitem__(self, idx):\n#         sequence, label = self.sequences[idx]\n#         return dict(\n#             sequence=torch.Tensor(sequence.to_numpy()),  # Convert DataFrame to tensor\n#             label=torch.tensor(label).long()\n#         )","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:43.434858Z","iopub.execute_input":"2024-11-10T09:07:43.435199Z","iopub.status.idle":"2024-11-10T09:07:43.442404Z","shell.execute_reply.started":"2024-11-10T09:07:43.435166Z","shell.execute_reply":"2024-11-10T09:07:43.441361Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # MixedEmotionDataLoader for train, validation, and test DataLoaders\n# class MixedEmotionDataLoader:\n    \n#     def __init__(self, train_sequences, test_sequences, batch_size):\n#         self.train_sequences = train_sequences\n#         self.test_sequences = test_sequences\n#         self.batch_size = batch_size\n#         self.setup()\n        \n#     def setup(self):\n#         self.train_dataset = MixedEmotionDataset(self.train_sequences)\n#         self.test_dataset = MixedEmotionDataset(self.test_sequences)\n        \n#     def get_train_loader(self):\n#         return DataLoader(\n#             self.train_dataset,\n#             batch_size=self.batch_size,\n#             shuffle=True,\n#             num_workers=cpu_count()\n#         )\n    \n#     def get_val_loader(self):\n#         return DataLoader(\n#             self.test_dataset,\n#             batch_size=self.batch_size,\n#             shuffle=False,\n#             num_workers=cpu_count()\n#         )\n    \n#     def get_test_loader(self):\n#         return DataLoader(\n#             self.test_dataset,\n#             batch_size=self.batch_size,\n#             shuffle=False,\n#             num_workers=cpu_count()\n#         )\n","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:43.443577Z","iopub.execute_input":"2024-11-10T09:07:43.443882Z","iopub.status.idle":"2024-11-10T09:07:43.451987Z","shell.execute_reply.started":"2024-11-10T09:07:43.443852Z","shell.execute_reply":"2024-11-10T09:07:43.45112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"# OLDER VERSION\n\n# class SequenceModel(nn.Module):\n#     # classification, number of hidden units, number of layers for LSTM\n    \n#     def __init__(self, n_features, n_classes , n_hidden=256, n_layers=3):\n#         super().__init__()\n        \n#         self.lstm = nn.LSTM(\n#         input_size = n_features,\n#         hidden_size=n_hidden,\n#         num_layers=n_layers,\n#         batch_first=True,\n#         dropout=0.75)\n        \n#         self.classifier = nn.Linear(n_hidden , n_classes)\n        \n#     def forward(self, x):\n#         self.lstm.flatten_parameters()\n#         _, (hidden, _) = self.lstm(x)\n        \n#         out = hidden[-1]\n        \n#         return self.classifier(out)\n    \n# NEWER VERSION\n\n\n# import torch\n# import torch.nn as nn\n\n# class ImprovedSequenceModel(nn.Module):\n#     def __init__(self, n_features, n_classes, n_hidden=512, n_layers=3):\n#         super().__init__()\n        \n#         # One-directional LSTM with lower dropout\n#         self.lstm = nn.LSTM(\n#             input_size=n_features,\n#             hidden_size=n_hidden,\n#             num_layers=n_layers,\n#             batch_first=True,\n#             dropout=0.3,\n#             bidirectional=False  # One-directional LSTM\n#         )\n        \n#         # Layer Normalization for LSTM outputs\n#         self.layer_norm = nn.LayerNorm(n_hidden)\n\n#         # Classifier Layer\n#         self.classifier = nn.Linear(n_hidden, n_classes)  # Adjust for one-directional output\n        \n#     def forward(self, x):\n#         self.lstm.flatten_parameters()\n        \n#         # Pass through LSTM\n#         output, (hidden, _) = self.lstm(x)\n        \n#         # Only use the last hidden state\n#         out = hidden[-1]  # Take the final hidden state only\n        \n#         # Apply layer normalization\n#         out = self.layer_norm(out)\n        \n#         return self.classifier(out)\n","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:43.453031Z","iopub.execute_input":"2024-11-10T09:07:43.453367Z","iopub.status.idle":"2024-11-10T09:07:43.464144Z","shell.execute_reply.started":"2024-11-10T09:07:43.453335Z","shell.execute_reply":"2024-11-10T09:07:43.463232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import torch\n# import torch.nn as nn\n# import torch.optim as optim\n# from torchmetrics import Accuracy\n# import matplotlib.pyplot as plt\n\n# class MixedEmotionPredictor(nn.Module): \n#     def __init__(self, n_features: int, n_classes: int):\n#         super(MixedEmotionPredictor, self).__init__()\n#         self.device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n# #         self.model = SequenceModel(n_features, n_classes).to(self.device)\n#         self.model = ImprovedSequenceModel(n_features, n_classes).to(self.device)\n\n#         self.criterion = nn.CrossEntropyLoss()\n#         self.accuracy_metric = Accuracy(task='multiclass', num_classes=n_classes).to(self.device)\n        \n#         # Initialize lists to store metrics for each epoch\n#         self.epoch_train_losses = []\n#         self.epoch_val_losses = []\n#         self.epoch_train_accuracies = []\n#         self.epoch_val_accuracies = []\n        \n#     def forward(self, x):\n#         return self.model(x)\n    \n#     def compute_loss_and_accuracy(self, outputs, labels):\n#         loss = self.criterion(outputs, labels)\n#         predictions = torch.argmax(outputs, dim=1)\n#         accuracy = self.accuracy_metric(predictions, labels)\n#         return loss, accuracy\n        \n#     def plot_metrics(self):\n#         num_epochs = min(len(self.epoch_train_losses), len(self.epoch_val_losses))\n#         epochs = range(1, num_epochs + 1)\n        \n#         train_losses = self.epoch_train_losses[:num_epochs]\n#         val_losses = self.epoch_val_losses[:num_epochs]\n#         train_accuracies = self.epoch_train_accuracies[:num_epochs]\n#         val_accuracies = self.epoch_val_accuracies[:num_epochs]\n        \n#         plt.figure(figsize=(12, 5))\n        \n#         # Plot Loss\n#         plt.subplot(1, 2, 1)\n#         plt.plot(epochs, train_losses, 'b', label='Training Loss')\n#         plt.plot(epochs, val_losses, 'r', label='Validation Loss')\n#         plt.title('Training and Validation Loss')\n#         plt.xlabel('Epochs')\n#         plt.ylabel('Loss')\n#         plt.legend()\n        \n#         # Plot Accuracy\n#         plt.subplot(1, 2, 2)\n#         plt.plot(epochs, train_accuracies, 'b', label='Training Accuracy')\n#         plt.plot(epochs, val_accuracies, 'r', label='Validation Accuracy')\n#         plt.title('Training and Validation Accuracy')\n#         plt.xlabel('Epochs')\n#         plt.ylabel('Accuracy')\n#         plt.legend()\n        \n#         plt.tight_layout()\n#         plt.show()\n    \n#     def train_model(self, train_loader, val_loader, num_epochs=10, lr=0.0001):\n#         optimizer = optim.Adam(self.parameters(), lr=lr)\n\n#         for epoch in range(num_epochs):\n#             # Training phase\n#             self.train()\n#             train_losses = []\n#             train_accuracies = []\n\n#             for batch in train_loader:\n#                 sequences = batch[\"sequence\"].to(self.device)\n#                 labels = batch[\"label\"].to(self.device)\n\n#                 optimizer.zero_grad()\n#                 outputs = self(sequences)\n#                 loss, accuracy = self.compute_loss_and_accuracy(outputs, labels)\n\n#                 loss.backward()\n#                 optimizer.step()\n\n#                 train_losses.append(loss.item())\n#                 train_accuracies.append(accuracy.item())\n\n#             avg_train_loss = sum(train_losses) / len(train_losses)\n#             avg_train_accuracy = sum(train_accuracies) / len(train_accuracies)\n\n#             # Validation phase\n#             self.eval()\n#             val_losses = []\n#             val_accuracies = []\n\n#             with torch.no_grad():\n#                 for batch in val_loader:\n#                     sequences = batch[\"sequence\"].to(self.device)\n#                     labels = batch[\"label\"].to(self.device)\n\n#                     outputs = self(sequences)\n#                     loss, accuracy = self.compute_loss_and_accuracy(outputs, labels)\n\n#                     val_losses.append(loss.item())\n#                     val_accuracies.append(accuracy.item())\n\n#             avg_val_loss = sum(val_losses) / len(val_losses)\n#             avg_val_accuracy = sum(val_accuracies) / len(val_accuracies)\n\n#             # Store epoch metrics for plotting\n#             self.epoch_train_losses.append(avg_train_loss)\n#             self.epoch_val_losses.append(avg_val_loss)\n#             self.epoch_train_accuracies.append(avg_train_accuracy)\n#             self.epoch_val_accuracies.append(avg_val_accuracy)\n\n#             # Print metrics\n#             print(f\"Epoch {epoch + 1}/{num_epochs}\")\n#             print(f\"  Training Loss: {avg_train_loss:.4f}, Training Accuracy: {avg_train_accuracy:.4f}\")\n#             print(f\"  Validation Loss: {avg_val_loss:.4f}, Validation Accuracy: {avg_val_accuracy:.4f}\")\n\n#         # Plot training and validation metrics\n#         self.plot_metrics()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:43.465572Z","iopub.execute_input":"2024-11-10T09:07:43.466267Z","iopub.status.idle":"2024-11-10T09:07:44.423468Z","shell.execute_reply.started":"2024-11-10T09:07:43.466222Z","shell.execute_reply":"2024-11-10T09:07:44.422618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# import torch\n# from torch.utils.tensorboard import SummaryWriter\n# import os\n\n# # Parameters\n# N_EPOCHS = 250\n# BATCH_SIZE = 64\n# CHECKPOINT_DIR = \"checkpoints\"\n# LOG_DIR = \"lightning_logs/surface\"\n# BEST_MODEL_PATH = os.path.join(CHECKPOINT_DIR, \"best-checkpoint.pth\")\n\n# # Ensure directories exist\n# os.makedirs(CHECKPOINT_DIR, exist_ok=True)\n\n# # Instantiate TensorBoard writer\n# writer = SummaryWriter(LOG_DIR)\n\n# # Function to save the model checkpoint\n# def save_checkpoint(model, optimizer, epoch, val_loss, best_val_loss):\n#     # Only save the model if the current val_loss is better than the best_val_loss\n#     if val_loss < best_val_loss:\n#         print(f\"Validation loss improved from {best_val_loss:.4f} to {val_loss:.4f}. Saving model...\")\n#         torch.save({\n#             'epoch': epoch,\n#             'model_state_dict': model.state_dict(),\n#             'optimizer_state_dict': optimizer.state_dict(),\n#             'val_loss': val_loss,\n#         }, BEST_MODEL_PATH)\n#         return val_loss\n#     return best_val_loss\n\n# # Training loop\n# def train(model, train_loader, val_loader, criterion, optimizer):\n#     best_val_loss = float('inf')\n\n#     for epoch in range(1, N_EPOCHS + 1):\n#         model.train()\n#         train_loss = 0.0\n#         train_correct = 0\n#         train_total = 0\n        \n#         # Training step\n#         for batch in train_loader:\n#             sequences, labels = batch[\"sequence\"].to(model.device), batch[\"label\"].to(model.device)\n#             optimizer.zero_grad()\n#             outputs = model(sequences)\n#             loss = criterion(outputs, labels)\n#             loss.backward()\n#             optimizer.step()\n            \n#             train_loss += loss.item() * sequences.size(0)\n#             train_correct += (outputs.argmax(1) == labels).sum().item()\n#             train_total += labels.size(0)\n        \n#         avg_train_loss = train_loss / train_total\n#         train_accuracy = train_correct / train_total\n        \n#         # Validation step\n#         model.eval()\n#         val_loss = 0.0\n#         val_correct = 0\n#         val_total = 0\n#         with torch.no_grad():\n#             for batch in val_loader:\n#                 sequences, labels = batch[\"sequence\"].to(model.device), batch[\"label\"].to(model.device)\n#                 outputs = model(sequences)\n#                 loss = criterion(outputs, labels)\n#                 val_loss += loss.item() * sequences.size(0)\n#                 val_correct += (outputs.argmax(1) == labels).sum().item()\n#                 val_total += labels.size(0)\n                \n#         avg_val_loss = val_loss / val_total\n#         val_accuracy = val_correct / val_total\n\n#         # Logging to TensorBoard\n#         writer.add_scalar(\"Loss/Train\", avg_train_loss, epoch)\n#         writer.add_scalar(\"Loss/Validation\", avg_val_loss, epoch)\n#         writer.add_scalar(\"Accuracy/Train\", train_accuracy, epoch)\n#         writer.add_scalar(\"Accuracy/Validation\", val_accuracy, epoch)\n\n#         # Print metrics\n#         print(f\"Epoch {epoch}/{N_EPOCHS}, \"\n#               f\"Train Loss: {avg_train_loss:.4f}, Train Accuracy: {train_accuracy:.4f}, \"\n#               f\"Val Loss: {avg_val_loss:.4f}, Val Accuracy: {val_accuracy:.4f}\")\n        \n#         # Save metrics to model for plotting\n#         model.epoch_train_losses.append(avg_train_loss)\n#         model.epoch_train_accuracies.append(train_accuracy)\n#         model.epoch_val_losses.append(avg_val_loss)\n#         model.epoch_val_accuracies.append(val_accuracy)\n        \n#         # Save checkpoint\n#         best_val_loss = save_checkpoint(model, optimizer, epoch, avg_val_loss, best_val_loss)\n\n#     writer.close()\n\n# # Example usage\n# device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n# n_features = 2  # using ppg_series and gsr_series features\n# n_classes = len(label_encoder.classes_)  # Replace with actual number of classes\n\n# # Initialize model, optimizer, and criterion\n# model = MixedEmotionPredictor(n_features=n_features, n_classes=n_classes).to(device)\n# optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)\n# criterion = torch.nn.CrossEntropyLoss()\n\n# # Instantiate data loader\n# data_loader = MixedEmotionDataLoader(train_sequences, test_sequences, BATCH_SIZE)\n# train_loader = data_loader.get_train_loader()\n# val_loader = data_loader.get_val_loader()\n\n# # Train the model\n# train(model, train_loader, val_loader, criterion, optimizer)\n\n# # Plot metrics\n# model.plot_metrics()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-10T09:07:44.425239Z","iopub.execute_input":"2024-11-10T09:07:44.425807Z","iopub.status.idle":"2024-11-10T09:28:36.487951Z","shell.execute_reply.started":"2024-11-10T09:07:44.425761Z","shell.execute_reply":"2024-11-10T09:28:36.486857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}